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
в файл или в буфер , из которого вы будете читать позже.