[英]Python using the ctypes library with math.h but the answer is always 0
[英]Strange Python ctypes behavior. Always loads the m (math) library
有人可以向我解釋為什么以下Python代碼有效嗎?
import ctypes
import ctypes.util
boblib = ctypes.cdll.LoadLibrary(ctypes.util.find_library("bob_is_your_uncle"))
boblib.cos.argtypes = [ctypes.c_double]
boblib.cos.restype = ctypes.c_double
print(boblib.cos(0)) # This prints out "1.0"
我1000%確信我的文件系統上沒有“ bob_is_your_uncle”庫。 但是,似乎ctypes加載了m
庫。 為什么會這樣呢?
另外,如果我這樣做: print(boblib)
,我得到了:
<CDLL 'None', handle 7f6a80f6d170 at 0x7f6a7f34d0b8>
CDLL 'None'
是什么意思?
提前致謝。
PS:我得到的兩個Python解釋器都做一個--version
: Python 3.6.5rc1
和Python 2.7.14+
。 上面的代碼在兩個版本上給出相同的結果。 我的操作系統是Debian(測試倉庫)。
它沒有加載數學庫。 它似乎正在加載具有cos
鏈接的Python可執行文件本身。
確實沒有名為bob_is_your_uncle
庫,因此find_library
返回None
。 (這就是您看到的輸出中None
來源。)
在Unix上, LoadLibrary
邏輯有一個特定的檢查進行並行運動的None
名稱為潛在空指針dlopen
程序。 dlopen
對空名稱進行特殊處理 :
如果filename為NULL,則返回的句柄用於主程序。
實際上,在Unix上, ctypes.pythonapi
被創建為
pythonapi = PyDLL(None)
解釋為什么首先要進行None
處理。 您創建的CDLL對象幾乎類似於ctypes.pythonapi
,除了它不保存GIL進行函數調用或檢查異常(因為CDLL而不是PyDLL),因此它與實際的C Python API交互沒有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.