Kompilasi modul fortran dengan f2py dan Python 3.6 di Windows 10

Saya mencoba (dan gagal) mengkompilasi modul fortran (khususnya igrf12.f dari BGS) menggunakan f2py dan Python 3.6 di Windows 10. Python diinstal menggunakan Anaconda 4.4.10.

Penyiapan saya:

  • Python 3.6.3 |Kustom Anaconda (64-bit)| (default, 15 Okt 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] di win32
  • Windows 10 Perusahaan (versi 1703)
  • NomorPy 1.14.0

Saya mengikuti petunjuk f2py dari dokumentasi SciPy dan panduan bermanfaat dari Dr.Michael Hirsch. Dr.Hirsch telah membuat modul pyigrf12, tetapi instalasi melalui pip gagal bagi saya, itulah yang awalnya memicu minat saya pada f2py.

Saya akan menjelaskan beberapa metode yang saya gunakan. Terlepas dari metodenya, saya selalu memulai dengan membuat file tanda tangan *.pyf menggunakan f2py igrf12.f -m pyigrf12 -h igrf12.pyf dan menambahkan atribut maksud(masuk/keluar) dengan tepat.

  • Metode 1: Gunakan C:\MinGW dan --compiler=mingw32
  • Metode 2: Gunakan C:\MinGW dan --compiler=msvc
  • Metode 3: gunakan mingw versi anaconda dan --compiler=mingw32
  • Metode 4: gunakan mingw versi anaconda dan --compiler=msvc

Metode 1:

Sebagai latar belakang, saya memiliki MinGW di C:\MinGW dan saya telah menambahkan C:\MinGW\bin ke Jalur pengguna saya. Sayangnya, saya tidak menginstal versi MinGW ini (saya mewarisi komputer ini dari seorang rekan), jadi saya tidak tahu dari mana sumbernya. Gcc --version dan gfortran --version adalah 5.3.0.

Saya menjalankan f2py -c igrf12.pyf igrf12.f --compiler=mingw32. Ini gagal dengan pesan kesalahan ini:

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

Masalahnya tampaknya melibatkan pembuatan libpython36.a dari python36.dll.

Setelah pencarian cepat di Google, saran di forum github untuk pywafo adalah menggunakan kompiler msvc alih-alih mingw32, yang mengarah ke Metode 2.

Metode 2: Untuk latar belakang, file yang terkait dengan msvc saya diambil dari C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\. Tidak yakin apakah itu membantu.

Saya menjalankan f2py -c igrf12.pyf igrf12.f --compiler=msvc. Ini menghasilkan dua file:

  • pyigrf12.cp36-win_amd64.pyd di direktori kerja saya saat ini dan,
  • libigrf12.BMWM6WD5Y3O3UTOEQITBXCIICXVMBEZS.gfortran-win_amd64.dll in .\UNKNOWN\.libs\

Ketika saya mencoba import pyigrf12, pertama saya menerima ImportError: DLL load failed: The specified module could not be found. Menggunakan Dependency Walker, saya menerima banyak kesalahan:

Keluaran Pejalan Ketergantungan f2py

tapi yang paling jelas untuk diatasi adalah terkait dengan libigrf12.BMWM6WD5Y3O3UTOEQITBXCIICXVMBEZS.gfortran-win_amd64.dll. Saya memindahkan file dll libigrf12 ini ke direktori kerja saya saat ini, bersama pyigrf12.cp36-win_amd64.pyd.

Sekarang ketika saya mencoba import pyigrf12, saya menerima ImportError: DLL load failed: %1 is not a valid Win32 application.. Beberapa postingan stackoverflow tampaknya menunjukkan bahwa ini adalah masalah konflik antara dll 32-bit dan Python 64-bit. Adakah yang bisa memberikan wawasan tentang ini? Setelah melakukan pencarian lebih lanjut, saya memutuskan untuk mencoba menggunakan mingw dan libpython versi anaconda.

Metode 3:

Saya menjalankan conda install mingw libpython, dan menginstal mingw 4.7-1 dan libpython 2.1-py36_0. Saya menjalankan f2py -c igrf12.pyf igrf12.f --compiler=mingw32, dan gagal dengan pesan kesalahan berikut:

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

Sekarang masalahnya sepertinya berhubungan dengan pembuatan libvcruntime140.a dari vcruntime140.dll. Sekali lagi format file dll tidak dikenali oleh objdump.exe.

Metode 4:

Upaya terakhir saya adalah menjalankan f2py -c igrf12.pyf igrf12.f --compiler=msvc dengan mingw versi anaconda diinstal. Untuk kasus ini, gfortran gagal dengan kesalahan ini:

   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'

Pada titik ini, saya hanya ingin tahu apakah mungkin membuat ekstensi fortran dengan pengaturan dan f2py saya. Saya tidak memiliki latar belakang kompilasi ekstensi C atau fortran di Windows, dan berdasarkan semua pertanyaan terkait masalah dengan instalasi Python 3.6 scipy dan numpy di Windows, sepertinya ini adalah masalah umum tanpa solusi sederhana.

Umpan balik atau wawasan apa pun akan sangat dihargai.


person dsholes    schedule 16.02.2018    source sumber


Jawaban (3)


Akhirnya berhasil.

Versi pendek:

Pastikan Anda menggunakan kompiler 64-bit (periksa tiga kali build untuk mingw-w64) untuk Python 64-bit. Tidak sejelas kedengarannya bagi f2py newb di Windows.

Versi panjang:

Saya mencopot pemasangan salinan MinGW saya yang sudah ada (saya menduga itu adalah versi 32 bit) dan sebagai gantinya mengunduh versi 64-bit tertentu dari mingw-w64 7.2.0 dari sourceforge, khususnya x86_64-7.2.0-release-posix-seh-rt_v5-rev1.7z. Pertanyaan stackoverflow ini berguna.

Saya membuka ritsleting dan menyalin folder "mingw64" ke drive C: (C:\mingw64). Saya menambahkan C:\mingw64\bin ke Jalur pengguna saya.

Saya mencopot pemasangan MinGW versi anaconda dengan conda uninstall mingw. Catatan, ini hanya diperlukan jika sebelumnya Anda telah menginstal MinGW menggunakan conda.

Setelah menjalankan f2py -c igrf12.pyf igrf12.f --compiler=mingw32 (di direktori yang sama dengan igrf12.pyf, lihat Dokumentasi Scipy tentang cara menghasilkan file *.pyf), pyigrf12.cp36-win_amd64.pyd dibuat tanpa kesalahan apa pun. Saya akhirnya berhasil import pyigrf12 dan mengakses subrutin Fortran yang mendasarinya (misalnya igrf12syn).

Catatan, saya juga berhasil menjalankan f2py -c igrf12.pyf igrf12.f --compiler=msvc, tetapi kemudian saya harus menyalin dan menempelkan libigrf12....gfortran-win_amd64.dll secara manual (dihasilkan di .\UNKNOWN\.libs\) ke direktori yang sama dengan pyigrf12.cp36-win_amd64.pyd untuk menghindari ImportError: DLL load failed: The specified module could not be found. disebutkan dalam Metode 2 pertanyaan saya.

Sekadar mengulangi: Pastikan C:\mingw64\bin ditambahkan ke jalur Anda!

Ngomong-ngomong, f2py tidak menimbulkan rasa sakit bagi saya di macOS Sierra dan Ubuntu. Jika cara di atas masih tidak berhasil untuk Anda, saya sarankan untuk mencoba di Linux, macOS, atau Subsistem Windows untuk Linux.

person dsholes    schedule 20.02.2018
comment
Jawaban Anda membantu saya dengan instalasi python Darkflow saya. Kesalahan saya disebabkan oleh c:\Rtools\mingw_32\bin\gcc.exe yaitu kompiler 32 bit yang mencoba melakukan build 64 bit. Menghapus instalasi Rtools berhasil. Tidak cukup terima kasih. Bersulang. - person Lobbie; 29.03.2018
comment
Luar biasa, senang itu membantu! - person dsholes; 30.03.2018

Saya memiliki masalah yang sama. Jawaban teratas sangat membantu. Saya ingin menambahkan beberapa komentar tentang DLL yang hilang. Alat yang berguna untuk membantu Anda mengetahui DLL mana yang hilang adalah Monitor Proses. Anda hanya perlu menambahkan filter python.exe dan melacak DLL mana yang gagal dimuat. Bagi saya, yang berikut ini hilang:

  • libgcc_s_seh-1.dll
  • libgfortran-5.dll
  • libquadmath-0.dll
  • libwinpthread-1.dll

Saya hanya perlu menyalinnya dari direktori bin/ rantai alat MinGW saya ke direktori yang sama di python.exe

person Han Luo    schedule 15.09.2020

Saya mengalami masalah yang sama, khususnya: ValueError: Symbol table not found Metode 3.

jawaban lubang hitam adalah solusinya, ditambah 2 poin kecil:

  • uninstall semua versi minggw
  • unduh mingw64 (dalam kasus saya: x86_64-8.1.0-posix-seh-rt_v6-rev0 ), instal
  • Tambahkan mingw64/bin ke JALUR
  • Kemudian kompilasi dengan f2py -c fortran_file.F90 -m module_name --compiler=mingw32 berjalan dengan baik, dan dapat diimpor dengan baik dengan Python: import module_name

Namun:

  1. modul Anda harus dikompilasi di partisi windows yang sama dengan instalasi Mingw32. Lain (mingw berada di bawah C:\, proyek saya di bawah D:\, saya mendapatkan kesalahan berikut, karena jalur Relatif tidak dibaca dari satu partisi ke partisi lain: f2py target file 'C:\\...' not generated

  2. file yang dikompilasi mungkin masih memerlukan beberapa perpustakaan eksternal. Dalam kasus saya, libquadmath-0.dll di mingw64\bin diperlukan dan harus tetap berada di PATH setiap saat. Jika tidak, saya mendapatkan kesalahan berikut: ImportError: DLL load failed:. Saya akhirnya mengidentifikasi dll ini dan menyalinnya ke dalam proyek saya.

person erwanp    schedule 04.07.2018