Использование Ctypes в Jupyter Notebook - PullRequest
2 голосов
/ 11 июля 2020

В Jupyter Notebook, когда я пытаюсь напечатать "hello world!" через функцию ctypes.cdll.msvcrt.printf , она меняет длину строки. Я просто пытаюсь изучить ctypes, и мне интересно, почему это произошло? Потому что, если я попытаюсь выполнить этот код в терминале, он будет работать хорошо. И как я могу использовать эту функцию в Jupyter Notebook? Код приведен ниже.

import ctypes

ctypes.cdll.msvcrt.printf(b"Hello World")

Вывод ячейки Jupyter Notebook:

11

Выход нормального выполнения:

Привет, мир

1 Ответ

2 голосов
/ 11 июля 2020

I Python не является настоящим терминалом.

То, что делает I Python (ядро в Jupyter Notebook), это захват stdout, stderr и другие буферы до того, как данные будут распечатаны на реальном терминале. Это происходит на уровне Python.

Однако ctypes не печатает на уровне Python с вашим кодом, он использует функцию , которая может печатать данные. Эта функция присутствует в совместно используемой библиотеке в системе и может печатать на уровне C (или, лучше сказать, используя низкоуровневую функцию печати в основном из ядра).

Что касается 11 значение, которое может быть длиной результата, который вы получаете от функции printf(), как вы сказали, т.е. len("Hello World") без символа окончания \0, однако это может быть даже реальный вывод объекта, который должен представлять данные распечатано через ctypes.cdll.msvcrt.printf(). В последнем случае я Python правильно захватил вывод, но ctypes просто сохранил его в другом месте (если вообще).

Я не на Windows, поэтому могу не говорю, каков результат, но попытайтесь сохранить его в переменной, а затем попытайтесь получить ее свойства, из которых вы могли бы получить результат и вставить его обратно в stdout для I Python:

out = ctypes.cdll.msvcrt.printf(b"Hello World")
dir(out)       # methods, properties, etc
vars(out)      # the whole dictionary structure (might fail)
out.__slots__  # __slots__ attribute in case __dict__ for vars() is not present

Здесь вы можете проверить capture_output().

Возможно, вы захотите перенаправить вывод из ctypes в файл или в буфер , из которого вы будете читать позже.

...