2015-12-02 541 views
2

我在Windows 7 64位上運行Python 2.7 32位(Anaconda)。Ctypes:無法導入windll

我想用ctypes的做Win32 API調用,我有一個很奇怪的問題:我能import ctypes,但不是import ctypes.windll,我得到以下錯誤:

ImportError: No module named windll 

我已檢索網頁所以我沒有發現類似於我的問題的東西(它可能是關於不可能導入ctypes,或者是您嘗試導入的DLL中的錯誤)。

有沒有人知道我做錯了什麼?

回答

2

看來你不能只是import ctypes.windll,你需要import ctypes然後用ctypes.windll。我發現,通過印刷的ctypes的所有屬性:

import ctypes 
print dir(ctypes) 

什麼也很有趣的是,IPython的自動完成功能被誤導在這裏,因爲它沒有import ctypes.後顯示windll作爲一種可能的選擇,當TAB-自動填充。

+1

記住,使用'ctypes.windll'讓你在任何模塊出現這種情況的一個函數加載同一個DLL,並設置原型('restype','argtypes','errcheck')憐憫你也在呼喚。函數指針實例緩存在'windll'緩存的'WinDLL'實例上,因此與其他用戶定義的類型和errcheck函數相比,您可能會發生衝突。從長遠來看,最好是調用'ctypes.WinDLL'來獲取特定於您的模塊或腳本的實例。 – eryksun

+0

@eryksun非常感謝您的提示! – gaborous

+0

爲了反彈eryksun的評論:你不能直接調用'ctypes.WinDLL.kernel32',你需要做以下事情:'from ctypes import LibraryLoader; windll = LibraryLoader(ctypes.WinDLL)',那麼你可以調用'windll.kernel32',而不需要提到eryksun提到的重定義問題。 – gaborous