Я попытался использовать C-функцию printf()
в командной строке python в Linux. Чтобы выполнить эту работу, я импортировал ctypes
. Моя проблема: если я создаю объект CDLL
для использования printf()
-функции в цикле, я получаю действительно странный вывод:
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
>>> for i in range(10):
... libc.printf("%d", i)
...
01
11
21
31
41
51
61
71
81
91
>>>
Однако, когда я вызываю этот цикл внутри функции, он работает как ожидалось:
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
>>> def pr():
... for i in range(10):
... libc.printf("%d", i)
... libc.printf("\n")
...
>>> pr()
0123456789
>>>
Я не могу догадаться, что вызывает такое поведение...
Я использую Python 2.7.6 для Linux, если это имеет значение.
EDIT:
Версия Python/операционная система не влияет на это. См. Ниже приведенный комментарий PM 2Ring. В Windows вам нужно изменить инициализацию libc
на libc = ctypes.CDLL("msvcrt.dll")
, где .dll
является необязательным. Другой способ получить правильный результат, чем вызов функции, - сохранить возвращаемое значение printf()
в переменной:
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6") # "mscvrt.dll" on windows
>>> for i in range(10):
... r = libc.printf("%d", i)
...
0123456789>>>
Я по-прежнему предпочитаю эту функцию, потому что вы можете добавить завершающую линейку.