Почему printf () дает странный вывод в python?

Я попытался использовать 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, если это имеет значение.

РЕДАКТИРОВАТЬ:

Версия / операционная система 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>>> 

Я по-прежнему предпочитаю функцию, потому что вы можете добавить завершающую линейку.

2 Solutions collect form web for “Почему printf () дает странный вывод в python?”

Эти дополнительные '1' в конце каждого номера – это возвращаемое значение из printf , которое возвращает количество символов, которые он печатает. Возвращаемое значение функции, вызываемой в интерактивном интерпретаторе, автоматически печатается (если только оно не указано).

Фактически, интерактивный интерпретатор печатает любое выражение None , которое не назначено. И, конечно же, он добавляет новую строку в эти выражения, что объясняет, почему вывод в вашем первом блоке кода находится в отдельных строках.

В вашей функции pr нет оператора return, поэтому он возвращает None , и, таким образом, лишний материал не печатается.

В то время как PM 2Ring ответил на вопрос достаточно хорошо, я думаю, стоит отметить, что поведение printf или что-то очень близкое, доступно как встроенный python, поэтому очень странно, что вы будете использовать версию библиотеки C, если вы не используете его, чтобы узнать, как использовать ctypes , и в этом случае продолжать.

Но, с другой стороны, странно хотеть использовать ctypes когда вы не использовали достаточно python для того, чтобы знать, как работает REPL … рискуя казаться высокомерным, как человек с 10-летним опытом работы с питонами, я никогда не на самом деле пришлось использовать ctypes .

Существует два встроенных параметра форматирования строк в python:

 print("%d" % (i,)) 

который является старым стилем и очень похож на printf, и

 print("{:d}".format(i)) 

который является новым для python 3 и является несколько более мощным. Есть вопросы, касающиеся различий на этом сайте. Обе вышеприведенные строки будут выводиться идентично libc.printf("%d\n", i) . Также можно печатать без новой строки .

Реализация CPython форматирования строк «%» фактически использует sprintf под капотом .

  • Как взять квадратный корень из больших чисел в Python?
  • Как заставить PyCharm IDE выполнить завершение кода для подмодулей pygame?
  • Как я могу щелкнуть кнопку в форме с помощью Selenium и Python 2.7?
  • Что означает x = 0 в Python?
  • Как подключить функцию страницы к следующей кнопке qwizard?
  • Windows 7 64bit - Python 2.7.3 64bit установлен - проблемы с Pygame
  • Keras: ImportError: нет модуля с именем data_utils
  • В объекте Python, как я могу увидеть список свойств, которые были определены с помощью декоратора @property?
  • Python - лучший язык программирования в мире.