簡體   English   中英

Python:使用FFTW加載DLL時,找不到模塊(OSError:[WinError 126])

[英]Python: module not found (OSError: [WinError 126]) when loading a DLL using FFTW

我正在使用Visual Studio 2015FFTW創建一個dll 然后我使用以下方式在Python下加載dll

libc = cdll.LoadLibrary('D:\\Library_C\\x64\\Release\\Library_C.dll')

在Visual Studio下,我當然要鏈接到FFTW .lib庫( libfftw3-3.liblibfftw3f-3.liblibfftw3l-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.

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