亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Jupyter Notebook 中使用 Ctypes

在 Jupyter Notebook 中使用 Ctypes

拉風的咖菲貓 2023-03-01 16:09:40
在 Jupyter Notebook 中,當我嘗試打印“hello world!”時 通過 ctypes.cdll.msvcrt.printf 函數它轉換字符串的長度。我只是想學習 ctypes,我想知道為什么會這樣?因為如果我嘗試在終端中執行該代碼,它運行良好。我如何在 Jupyter Notebook 中使用該功能?代碼如下。import ctypes ctypes.cdll.msvcrt.printf(b"Hello World")Jupyter Notebook Cell 輸出:11正常執行輸出:你好世界
查看完整描述

1 回答

?
慕田峪9158850

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 到一個文件一個您以后要從中讀取的緩沖區。


查看完整回答
反對 回復 2023-03-01
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號