2017-07-06 16 views
0

現在、python3スクリプトで使用するFortranサブルーチンをラップする際に問題が発生しています。この問題は、私がサブルーチンでOpenMPを使用しようとして以来起きています。例えばOpenMPでコンパイルされたf2pyモジュールのPythonインポートエラー

、私は私のスクリプトにこのモジュールをインポートしようとすると、「test.f90は」並列化ループが含まれているFortranのサブルーチンであるf2py -c -m --fcompiler=gfortran --compiler=mingw32 --f90flags='-fopenmp' test test.f90 -lgompを使用してモジュールのtest.pyd 'をコンパイルした場合、私はImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.に遭遇。

コンパイル時にフラグを削除するか、Fortranサブルーチンの!$ompコメントを削除すると、このエラーが取り除かれます。

サブルーチンをほぼ同等のFortranプログラムに変更すると、プログラムは.exeにコンパイルされ、正しく実行されます。

私はちょうどあなたのビルドコマンドを試みたが、それはprefectly正常に見える

答えて

0

TDM-GCCからGNU FortranとCコンパイラを使用して、AMD64プロセッサと、Windowsの10のプラットフォーム上でです。私はあなた自身のやり方でコンパイルされたPythonモジュールから並列サブルーチンを実行することができます。

モジュールを使用しているPythonコードをどのように実行していますか?私は(bashシェルから)実行するように助言する問題は、あなたのパスに

を(libgomp-1.dllと命名された)OpenMPのDLLを持っていないことだと思う:

where libgomp-1.dll

場合コマンドがそれを見つけることができない場合は、あなたのパスにopenmp dll(通常は "C:\ tools \ mingw64 \ bin \")のパスを追加するべきでしょう。

これを行うためには、あなたが使用することができます。

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

は良いチャンスは、あなたがパスを適切に考慮していない、あなたのPythonコードを実行されている方法があり、あなたが並列実行可能ファイルを実行することができますので、問題なく。

+0

ありがとうございます。私は 'C:\ TDM-GCC-64 \ bin'をCとFortranコンパイラと' libgomp-1.dll'の両方を含む私のPATHに含めました。 最初はiPythonコンソール(Anaconda3で動作)からスクリプトを実行していましたが、問題を単純化するために、Python3コンソールを開き、 'import test'と入力するだけで同じ効果が得られました。もちろん正しいディレクトリ) –

+0

あなたのスクリプトがあるディレクトリに普通の 'cmd'コンソールを開き、' python your_script.py'を実行するとどうなりますか?同じエラーが発生しますか? (anaconda pythonコンソールではない)。 AnacondaがあなたのPATHを乱しているかもしれません。 – Thundzz

+0

残念ながら、私はPython 3.6.0で同じエラーが発生します。私はシステムPATHからAnaconda3を削除し、OpenMPフラグを付けずにコンパイルするとモジュールが正常にインポートされ、フラグを再導入すると元のエラーが出ます。 私はちょうど 'cmd'コンソールに行っている 、および入力された私のPython36フォルダに.pydファイルの両方を追加した後: 'インポートnumpy'エラーが最後の行の後に表示されます '輸入 omp_test_mod' '輸入test_mod'従来通り。 'libgomp-1.dll'は実際にPATHに入っていることを示しています。 –

関連する問題