1 回答

TA貢獻1794條經驗 獲得超8個贊
IPython 不是真正的終端。
IPython(Jupyter Notebook 的核心)所做的是在數據打印到真實終端之前捕獲stdout,和其他緩沖區。stderr這發生在 Python 級別。
但是,ctypes不會使用您的代碼在 Python 級別打印,它使用能夠打印數據的函數。該函數存在于系統的共享庫中,并且能夠在 C 級別上打?。ɑ蛘吒_切地說,主要是通過使用內核中的低級打印功能)。
關于該11值,這可能是您從函數中獲得的結果的長度,printf()如您所說,即len("Hello World")沒有結束\0字符,但它甚至可能是應該表示通過打印出的數據的對象的實際輸出ctypes.cdll.msvcrt.printf()。如果是后者,IPython 會正確捕獲輸出,但ctypes只是將其存儲在不同的位置(如果有的話)。
我不在 Windows 上,所以不能說結果是什么,但嘗試將它存儲在一個變量中,然后嘗試獲取它的屬性,您可以從中檢索輸出并將其插回 for IPython stdout:
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
到一個文件或一個您以后要從中讀取的緩沖區。
添加回答
舉報