簡體   English   中英

奇怪的Python ctypes行為。 始終加載m(數學)庫

[英]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解釋器都做一個--versionPython 3.6.5rc1Python 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM