![](/img/trans.png)
[英]Error when loading module in Python: OSError: [WinError 126] The specified module could not be found
[英]Python: module not found (OSError: [WinError 126]) when loading a DLL using FFTW
我正在使用Visual Studio 2015
和FFTW
創建一個dll
。 然后我使用以下方式在Python下加載dll
libc = cdll.LoadLibrary('D:\\Library_C\\x64\\Release\\Library_C.dll')
在Visual Studio下,我當然要鏈接到FFTW .lib
庫( libfftw3-3.lib
, libfftw3f-3.lib
, libfftw3l-3.lib
)。 一切都編譯良好。 該dll
也已創建。
但是,Python毫不客氣地說,找不到該模塊。
如果我從編譯后的代碼中刪除對FFTW
函數的任何調用,Python就會找到該模塊。
我該如何解決這個問題?
我將不勝感激。
編輯
我收到的錯誤代碼是
OSError: [WinError 126]
谷歌搜索,我注意到在加載外部dll
時,這樣的錯誤代碼在Python
非常普遍。
很有可能是由於找不到libfftw3 dll引起的。
為了進行簡短測試,可以將Python程序和所有DLL簡單地存儲在同一目錄中。 然后啟動命令提示符並切換到該目錄(!),並通過鍵入python <your.py>
從命令行啟動Python程序。 因此,所有必需的DLL都位於當前目錄中,並且可以找到。
請注意,使用導入庫時(最有可能的),您自己的dll不是靜態鏈接到fftw庫。 因此,必須在運行時找到libfftw3 dll。 有幾種方法可以做到這一點。
DLL搜索順序
有一個有關DLL搜索順序的Microsoft文檔:
https://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-search-order
例如,存在以下可能性:
當前目錄(如果您正在使用命令行)
將DLL所在的目錄添加到環境變量PATH
正如@JackOLantem所述,您還可以直接從Python程序中加載隱式依賴庫
說明
如果我的上述評論不能解決問題,請使用簡單的測試案例逐步指南。 我試圖使測試用例盡可能接近您的示例。
創建導入庫
如果您正在使用安裝了64位Python的64位計算機上工作,請不要忘記使用/ machine:x64參數:
lib /機器:x64 /def:libfftw3-3.def
創建引用了一些libfftw3函數的自己的dll,例如:
#include "windows.h"
#include "fftw3.h"
#define NUM_POINTS 128
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
__declspec(dllexport) char *plan() {
fftw_complex signal[NUM_POINTS];
fftw_complex result[NUM_POINTS];
fftw_plan plan = fftw_plan_dft_1d(NUM_POINTS,
signal,
result,
FFTW_FORWARD,
FFTW_ESTIMATE);
return fftw_sprint_plan(plan);
}
在Visual Studio中,切換到x64配置以生成64位dll。
在Additional Dependencies
項下的配置屬性/鏈接器/輸入下,添加libttfw3-3.lib。
在“配置屬性/鏈接器/常規”下,將.lib所在的路徑添加到“ Additional Library Directories
。
Python測試
Python測試程序如下所示:
import ctypes
libc = ctypes.cdll.LoadLibrary('C:\\Users\\stephan\\Documents\\pyfftw\\Library_C\\x64\\Debug\\Library_C.dll')
libc.plan.restype = ctypes.c_char_p
print(libc.plan())
一個人不需要使用絕對路徑。 如果將Library_C.dll也放到.py文件所在的文件夾中,則可以編寫:
libc = ctypes.cdll.LoadLibrary('Library_C.dll')
結果是一樣的。 當然,如果您喜歡其他解決方案,則適用Windows dll的標准搜索順序。
結果
將libfftw3-3.dll復制到.py文件所在的目錄后,可以通過以下方式調用它:
cd <dir-with-python-program-and-dlls>
python test.py
結果是這樣的:
b'(dft-ct-dit/8\n (dftw-direct-8/12 "t3fv_8_avx")\n (dft-direct-16-x8 "n2fv_16_avx"))'
重要
在執行以下步驟之前,必須執行Stephan Schlecht的步驟。
解
依賴關系工具對我很有幫助。 它清楚地表明了對libfftw3-3.dll
的依賴。
引用斯蒂芬
最有可能是由於
libfftw3
dll
引起的。為了進行快速測試,只需將其放在
.py
文件所在的目錄中。請注意,使用導入庫時(最有可能的),您自己的dll不是靜態鏈接到
fftw
庫。 因此,必須在運行時找到libfftw3
dll
。
但是,僅將FFTW
dll
放在相同的.py
目錄中是不夠的。 我需要顯式加載它:
FFTWFile = 'D:\\FFTW64\\libfftw3-3.dll'
FFTW64 = cdll.LoadLibrary(FFTWFile)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.