ฉันกำลังพยายาม (และล้มเหลว) ในการรวบรวมโมดูล Fortran (โดยเฉพาะ igrf12.f จาก BGS) โดยใช้ f2py และ Python 3.6 บน Windows 10 ติดตั้ง Python โดยใช้ Anaconda 4.4.10
การตั้งค่าของฉัน:
- Python 3.6.3 | แบบกำหนดเองของ Anaconda (64 บิต) | (ค่าเริ่มต้น 15 ตุลาคม 2017, 03:27:45) [MSC v.1900 64 บิต (AMD64)] บน win32
- Windows 10 องค์กร (เวอร์ชัน 1703)
- NumPy 1.14.0
ฉันทำตามคำแนะนำ f2py จากเอกสาร SciPy และคำแนะนำที่เป็นประโยชน์ จาก ดร.ไมเคิล เฮิร์ช Dr.Hirsch ได้สร้างโมดูล pyigrf12 แต่การติดตั้งผ่าน pip ล้มเหลวสำหรับฉัน ซึ่งเป็นสิ่งที่กระตุ้นให้ฉันสนใจ f2py ในตอนแรก
ฉันจะสรุปวิธีการบางอย่างที่ฉันใช้ ไม่ว่าจะด้วยวิธีใดก็ตาม ฉันมักจะเริ่มต้นด้วยการสร้างไฟล์ลายเซ็น *.pyf โดยใช้ f2py igrf12.f -m pyigrf12 -h igrf12.pyf
และเพิ่มแอตทริบิวต์ intent(in/out) อย่างเหมาะสม
- วิธีที่ 1: ใช้ C:\MinGW และ
--compiler=mingw32
- วิธีที่ 2: ใช้ C:\MinGW และ
--compiler=msvc
- วิธีที่ 3: ใช้ mingw และ
--compiler=mingw32
เวอร์ชันอนาคอนดา - วิธีที่ 4: ใช้ mingw และ
--compiler=msvc
เวอร์ชันอนาคอนดา
วิธีที่ 1:
สำหรับพื้นหลัง ฉันมี MinGW ที่ C:\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
ดูเหมือนว่าปัญหาจะเกี่ยวข้องกับการสร้าง libpython36.a จาก python36.dll
หลังจากค้นหาโดย Google อย่างรวดเร็ว แนะนำให้ใช้คำแนะนำในฟอรัม github สำหรับ pywafo คอมไพเลอร์ msvc แทน mingw32 ซึ่งนำไปสู่วิธีที่ 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
สิ่งนี้จะสร้างไฟล์สองไฟล์:
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.
เมื่อใช้ Dependency Walker ฉันได้รับข้อผิดพลาดมากมาย:
แต่สิ่งที่ชัดเจนที่สุดที่ต้องพูดถึงนั้นเกี่ยวข้องกับ libigrf12.BMWM6WD5Y3O3UTOEQITBXCIICXVMBEZS.gfortran-win_amd64.dll
ฉันย้ายไฟล์ libigrf12 dll นี้ไปยังไดเร็กทอรีการทำงานปัจจุบันของฉัน ควบคู่ไปกับ pyigrf12.cp36-win_amd64.pyd
ตอนนี้เมื่อฉันลอง import pyigrf12
ฉันจะได้รับ ImportError: DLL load failed: %1 is not a valid Win32 application.
ดูเหมือนว่าโพสต์ stackoverflow บางรายการจะระบุว่านี่เป็นปัญหาเกี่ยวกับข้อขัดแย้งระหว่าง dll 32 บิตและ Python 64 บิต ใครสามารถให้ข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้ได้บ้าง หลังจากค้นหาเพิ่มเติม ฉันตัดสินใจลองใช้ mingw และ libpython เวอร์ชันอนาคอนดา
วิธีที่ 3:
ฉันเรียกใช้ conda install mingw libpython
และติดตั้ง mingw 4.7-1 และ libpython 2.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
ตอนนี้ดูเหมือนว่าปัญหาจะเกี่ยวข้องกับการสร้าง libvcruntime140.a จาก vcruntime140.dll เป็นอีกครั้งที่ objdump.exe ไม่รู้จักรูปแบบไฟล์ dll
วิธีที่ 4:
ความพยายามครั้งสุดท้ายของฉันคือการเรียกใช้ f2py -c igrf12.pyf igrf12.f --compiler=msvc
โดยติดตั้ง mingw เวอร์ชันอนาคอนดา ในกรณีนี้ 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'
ณ จุดนี้ ฉันแค่ต้องการทราบว่าเป็นไปได้ไหมที่จะสร้างส่วนขยาย fortran ด้วยการตั้งค่าและ f2py ของฉัน ฉันไม่มีการคอมไพล์พื้นหลังส่วนขยาย C หรือ fortran บน Windows และจากคำถามทั้งหมดที่เกี่ยวข้องกับปัญหาเกี่ยวกับการติดตั้ง Python 3.6 scipy และ numpy บน Windows ดูเหมือนว่านี่เป็นปัญหาทั่วไปโดยไม่มีวิธีแก้ปัญหาง่ายๆ
ข้อเสนอแนะหรือข้อมูลเชิงลึกใด ๆ ที่จะได้รับการชื่นชมอย่างมาก