私はf2pyとPython 3.6 on Windows 10)を使用してFortranモジュール(具体的には igrf12.f BGSから)をコンパイルしようとしています(そして失敗しています)。PythonはAnaconda4.4.10を使用してインストールされました。
私の設定:
SciPyドキュメント からのf2pyの指示と、Dr.Michael Hirschからの非常に 役立つガイド に従いました。 Dr.Hirschがpyigrf12モジュールを作成しましたが、pipを介したインストールが失敗しました。これが、最初にf2pyに興味を持ったきっかけとなりました。
私が使用しているいくつかの方法の概要を説明します。方法に関係なく、私は常に_f2py igrf12.f -m pyigrf12 -h igrf12.pyf
_を使用して* .pyf署名ファイルを作成し、intent(in/out)属性を適切に追加することから始めます。
--compiler=mingw32
_を使用する--compiler=msvc
_を使用する--compiler=mingw32
_を使用する--compiler=msvc
_を使用する方法1:
背景として、C:\ MinGWにMinGWがあり、ユーザーパスにC:\ MinGW\binを追加しました。残念ながら、私はこのバージョンのMinGWをインストールしなかった(私はこのコンピューターを同僚から継承した)ので、どこから入手したのかわかりません。 gcc--versionおよびgfortran--versionは5.3.0です。
_f2py -c igrf12.pyf igrf12.f --compiler=mingw32
_を実行します。これは次のエラーメッセージで失敗します:
_Building import library (Arch=AMD64):
"C:\Users\Sholes\AppData\Local\Continuum\anaconda3\libs\libpython36.a"
(from C:\Users\Sholes\AppData\Local\Continuum\anaconda3\python36.dll)
objdump.exe: C:\Users\Sholes\AppData\Local\Continuum\anaconda3\python36.dll: File format not recognized
Traceback (most recent call last):
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\Scripts\\f2py.py", line 28, in <module>
main()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\f2py\f2py2e.py", line 648, in main
run_compile()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\f2py\f2py2e.py", line 633, in run_compile
setup(ext_modules=[ext])
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\core.py", line 169, in setup
return old_setup(**new_attr)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\core.py", line 148, in setup
dist.run_commands()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\command\build.py", line 47, in run
old_build.run(self)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\command\build.py", line 135, in run
self.run_command(cmd_name)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\command\build_ext.py", line 117, in run
force=self.force)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\ccompiler.py", line 733, in new_compiler
compiler = klass(None, dry_run, force)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 104, in __init__
build_import_library()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 416, in build_import_library
return _build_import_library_AMD64()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 472, in _build_import_library_AMD64
generate_def(dll_file, def_file)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 302, in generate_def
raise ValueError("Symbol table not found")
ValueError: Symbol table not found
_
この問題は、python36.dllからlibpython36.aをビルドすることに関係しているようです。
簡単なグーグル検索の後、 pywafoのgithubフォーラム に関する提案は、mingw32の代わりにmsvcコンパイラを使用することであり、方法2につながりました。
方法2:バックグラウンドとして、私のmsvcに関連するファイルがC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\
からプルされています。それが役立つかどうかはわかりません。
_f2py -c igrf12.pyf igrf12.f --compiler=msvc
_を実行します。これにより、2つのファイルが生成されます。
pyigrf12.cp36-win_AMD64.pyd
_と、libigrf12.BMWM6WD5Y3O3UTOEQITBXCIICXVMBEZS.gfortran-win_AMD64.dll
_ in _.\UNKNOWN\.libs\
__import pyigrf12
_を実行しようとすると、最初に_ImportError: DLL load failed: The specified module could not be found.
_を受け取ります。DependencyWalkerを使用すると、多くのエラーが発生します。
しかし、対処すべき最も明白なものは_libigrf12.BMWM6WD5Y3O3UTOEQITBXCIICXVMBEZS.gfortran-win_AMD64.dll
_に関連しています。このlibigrf12dllファイルを_pyigrf12.cp36-win_AMD64.pyd
_と一緒に現在の作業ディレクトリに移動します。
_import pyigrf12
_を試すと、_ImportError: DLL load failed: %1 is not a valid Win32 application.
_を受け取ります。一部のstackoverflowの投稿は、これが32ビットdllと64ビットPythonの間の競合の問題であることを示しているようです。 誰かがこれについて洞察を提供できますか?さらに検索した後、私はmingwとlibpythonのanacondaバージョンを使用することにしました。
方法3:
_conda install mingw libpython
_を実行すると、mingw4.7-1とlibpython2.1-py36_0がインストールされます。 _f2py -c igrf12.pyf igrf12.f --compiler=mingw32
_を実行すると、次のエラーメッセージが表示されて失敗します。
_Building msvcr library:
"C:\Users\Sholes\AppData\Local\Continuum\anaconda3\libs\libvcruntime140.a"
(from C:\Users\Sholes\AppData\Local\Continuum\anaconda3\vcruntime140.dll)
objdump.exe: C:\Users\Sholes\AppData\Local\Continuum\anaconda3\vcruntime140.dll: File format not recognized
Traceback (most recent call last):
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\Scripts\\f2py.py", line 28, in <module>
main()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\f2py\f2py2e.py", line 648, in main
run_compile()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\f2py\f2py2e.py", line 633, in run_compile
setup(ext_modules=[ext])
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\core.py", line 169, in setup
return old_setup(**new_attr)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\core.py", line 148, in setup
dist.run_commands()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\command\build.py", line 47, in run
old_build.run(self)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\command\build.py", line 135, in run
self.run_command(cmd_name)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\command\build_ext.py", line 117, in run
force=self.force)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\ccompiler.py", line 733, in new_compiler
compiler = klass(None, dry_run, force)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 107, in __init__
msvcr_success = build_msvcr_library()
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 399, in build_msvcr_library
generate_def(dll_file, def_file)
File "C:\Users\Sholes\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py", line 302, in generate_def
raise ValueError("Symbol table not found")
ValueError: Symbol table not found
_
この問題は、vcruntime140.dllからlibvcruntime140.aをビルドすることに関連しているようです。この場合も、dllファイル形式がobjdump.exeによって認識されません。
方法4:
私の最後の試みは、anacondaバージョンのmingwをインストールして_f2py -c igrf12.pyf igrf12.f --compiler=msvc
_を実行することでした。この場合、gfortranは次のエラーで失敗しました:
_ C:\Users\Sholes\AppData\Local\Continuum\anaconda3\Scripts\gfortran.bat -Wall -g -Wall -g -shared
..\..\..\AppData\Local\Temp\tmpugo__0q9\Release\igrf12.o -Lc:\users\sholes\appdata\local\continuum\anaconda3\mingw\lib\gcc\x86_64-w64-mingw32\4.7.0 -LC:\Users\Sholes\AppData\Local\Continuum\anaconda3\libs -LC:\Users\Sholes\AppData\Local\Continuum\anaconda3\PCbuild\AMD64 -o C:\Users\Sholes\AppData\Local\Temp\tmpugo__0q9\Release\extra-dll\libigrf12.75XJA5DX6DTO7YIZ7X6ZHJYTRDCCYQYR.gfortran-win_AMD64.dll -Wl,--allow-multiple-definition -Wl,--output-def,C:\Users\Sholes\AppData\Local\Temp\tmpugo__0q9\Release\libigrf12.75XJA5DX6DTO7YIZ7X6ZHJYTRDCCYQYR.gfortran-win_AMD64.def -Wl,--export-all-symbols -Wl,--enable-auto-import -static -mlong-double-64
gfortran.exe: error: unrecognized command line option '-mlong-double-64'
_
この時点で、セットアップとf2pyを使用してFortran拡張機能を作成できるかどうかを知りたいだけです。 WindowsでCまたはFortran拡張機能をコンパイルするバックグラウンドはありません。また、WindowsでのPython 3.6 scipyおよびnumpyのインストールに関する問題に関連するすべての質問に基づくと、これは簡単な解決策のない一般的な問題。
フィードバックや洞察をいただければ幸いです。
私は同じ問題を抱えていました。特に、方法3のValueError: Symbol table not found
です。
dsholesの答え が解決策であり、さらに2つのマイナーポイントがあります。
x86_64-8.1.0-posix-seh-rt_v6-rev0
)をダウンロードし、インストールしますmingw64/bin
をPATHに追加しますf2py -c fortran_file.F90 -m module_name --compiler=mingw32
を使用したコンパイルは正常に実行され、Pythonで適切にインポートできます。import module_name
しかしながら:
モジュールは、Mingw32がインストールされているのと同じWindowsパーティションにコンパイルする必要があります。それ以外の場合(mingwはC:\
の下にあり、私のプロジェクトはD:\
の下にありました。相対パスがパーティション間で読み取られないため、次のエラーが発生します:f2py target file 'C:\\...' not generated
コンパイルされたファイルには、まだいくつかの外部ライブラリが必要な場合があります。私の場合、mingw64\binのlibquadmath-0.dll
が必要であり、常にPATHに残っている必要があります。そうしないと、次のエラーが発生します:ImportError: DLL load failed:
。最終的にこれらのdllを識別し、プロジェクト内にコピーしました。