web-dev-qa-db-ja.com

Windows10でf2pyとPython 3.6を使用してFortranモジュールをコンパイルします

私はf2pyとPython 3.6 on Windows 10)を使用してFortranモジュール(具体的には igrf12.f BGSから)をコンパイルしようとしています(そして失敗しています)。PythonはAnaconda4.4.10を使用してインストールされました。

私の設定:

  • Python 3.6.3 | Anacondaカスタム(64ビット)| (デフォルト、2017年10月15日、03:27:45)[MSC v.1900 64ビット(AMD64)] on win32
  • Windows 10 Enterprise(バージョン1703)
  • NumPy 1.14.0

SciPyドキュメント からのf2pyの指示と、Dr.Michael Hirschからの非常に 役立つガイド に従いました。 Dr.Hirschがpyigrf12モジュールを作成しましたが、pipを介したインストールが失敗しました。これが、最初にf2pyに興味を持ったきっかけとなりました。

私が使用しているいくつかの方法の概要を説明します。方法に関係なく、私は常に_f2py igrf12.f -m pyigrf12 -h igrf12.pyf_を使用して* .pyf署名ファイルを作成し、intent(in/out)属性を適切に追加することから始めます。

  • 方法1:C:\ MinGWと_--compiler=mingw32_を使用する
  • 方法2:C:\ MinGWと_--compiler=msvc_を使用する
  • 方法3:mingwのanacondaバージョンと_--compiler=mingw32_を使用する
  • 方法4:mingwのanacondaバージョンと_--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を使用すると、多くのエラーが発生します。

f2py Dependency Walker Output

しかし、対処すべき最も明白なものは_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のインストールに関する問題に関連するすべての質問に基づくと、これは簡単な解決策のない一般的な問題。

フィードバックや洞察をいただければ幸いです。

6
dsholes

私は同じ問題を抱えていました。特に、方法3のValueError: Symbol table not foundです。

dsholesの答え が解決策であり、さらに2つのマイナーポイントがあります。

  • minggwのすべてのバージョンをアンインストールします
  • mingw64(私の場合: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

しかしながら:

  1. モジュールは、Mingw32がインストールされているのと同じWindowsパーティションにコンパイルする必要があります。それ以外の場合(mingwはC:\の下にあり、私のプロジェクトはD:\の下にありました。相対パスがパーティション間で読み取られないため、次のエラーが発生します:f2py target file 'C:\\...' not generated

  2. コンパイルされたファイルには、まだいくつかの外部ライブラリが必要な場合があります。私の場合、mingw64\binのlibquadmath-0.dllが必要であり、常にPATHに残っている必要があります。そうしないと、次のエラーが発生します:ImportError: DLL load failed:。最終的にこれらのdllを識別し、プロジェクト内にコピーしました。

0
erwanp