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:
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.