2017-07-06 95 views
0

我在包裝一些Fortran子程序以用於python3腳本時遇到了一個問題。自從我試圖在子例程中使用OpenMP後,此問題纔出現。用OpenMP編譯的f2py模塊的Python導入錯誤

例如,如果我使用f2py -c -m --fcompiler=gfortran --compiler=mingw32 --f90flags='-fopenmp' test test.f90 -lgomp編譯模塊'test.pyd',其中'test.f90'是包含並行循環的Fortran子例程,試圖將此模塊導入到我的腳本中時,遇到ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.

刪除編譯中的-fopenmp標誌或Fortran子例程中的!$omp註釋刪除此錯誤。

將子例程更改爲大致等效的Fortran程序,該程序編譯爲.exe並且並行運行正確。

我是Windows 10平臺上,與AMD64處理器,採用GNU Fortran和C編譯器從TDM-GCC

回答

0

我只是想你的構建命令,它看起來prefectly罰款。我自己能夠從一個Python模塊運行一個並行子程序,這個子程序是按照你所做的方式編譯的。

你是如何執行使用你的模塊的Python代碼?我認爲問題是,你沒有OpenMP的DLL(名爲libgomp-1.dll)在您的路徑

我勸你(從bash shell中)運行:

where libgomp-1.dll

如果該命令找不到它,那麼你應該添加路徑到你的PATH的openmp dll(通常是「C:\ tools \ mingw64 \ bin \」)。

爲了做到這一點,你可以使用:

export PATH=$PATH:C:\tools\mingw64\bin\ && python script_using_module.py 

有一個很好的機會,你正在執行Python代碼不會爲路徑正確計算的方式,因爲你可以運行並行執行沒有問題。

+0

謝謝您的回覆!我在我的PATH中包含了'C:\ TDM-GCC-64 \ bin',其中包括C和Fortran編譯器以及'libgomp-1.dll'。 最初我從iPython控制檯(使用Anaconda3)運行腳本,但是爲了簡化問題,我只是嘗試打開一個Python3控制檯,並輸入'import test',達到相同的效果(將.pyd文件添加到當然是正確的目錄) –

+0

如果你在你的腳本所在的目錄中打開一個常規的'cmd'控制檯,然後運行'python your_script.py'?它會產生相同的錯誤嗎? (不是用anaconda python控制檯)。水蟒可能會混淆你的PATH。 – Thundzz

+0

不幸的是,我在Python 3.6.0中遇到了同樣的錯誤。我已經從系統PATH中刪除了Anaconda3,並且在編譯時沒有OpenMP標誌,模塊成功導入,並且當我重新引入該標誌時,出現原始錯誤。 我剛纔已經進入一個'cmd'控制檯,將兩個.pyd文件輸入我Python36文件夾後: '進口numpy' '進口omp_test_mod' 最後一行後,將出現錯誤 '進口test_mod'像之前一樣。鍵入'libgomp-1.dll'表明它確實在PATH中。 –