คอมไพล์โมดูล fortran ด้วย f2py และ Python 3.6 บน Windows 10

ฉันกำลังพยายาม (และล้มเหลว) ในการรวบรวมโมดูล 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 ฉันได้รับข้อผิดพลาดมากมาย:

เอาต์พุตวอล์คเกอร์พึ่งพา f2py

แต่สิ่งที่ชัดเจนที่สุดที่ต้องพูดถึงนั้นเกี่ยวข้องกับ 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 ดูเหมือนว่านี่เป็นปัญหาทั่วไปโดยไม่มีวิธีแก้ปัญหาง่ายๆ

ข้อเสนอแนะหรือข้อมูลเชิงลึกใด ๆ ที่จะได้รับการชื่นชมอย่างมาก


person dsholes    schedule 16.02.2018    source แหล่งที่มา


คำตอบ (3)


ในที่สุดก็ได้งานนี้

ฉบับย่อ:

ตรวจสอบให้แน่ใจว่าคุณใช้คอมไพเลอร์ 64 บิต (ตรวจสอบบิลด์สำหรับ mingw-w64 สามครั้ง) สำหรับ Python 64 บิต ไม่ชัดเจนเท่ากับเสียง f2py newb บน Windows

เวอร์ชันยาว:

ฉันถอนการติดตั้งสำเนา MinGW ที่มีอยู่แล้ว (ฉันสงสัยว่าเป็นเวอร์ชัน 32 บิต) และดาวน์โหลด mingw-w64 7.2.0 จาก sourceforge โดยเฉพาะ x86_64-7.2.0-release-posix-seh-rt_v5-rev1.7z คำถามเกี่ยวกับ stackoverflow นี้มีประโยชน์

ฉันแตกไฟล์และคัดลอกโฟลเดอร์ "mingw64" ลงในไดรฟ์ C: (C:\mingw64) ฉันเพิ่ม C:\mingw64\bin ในเส้นทางผู้ใช้ของฉัน

ฉันถอนการติดตั้ง MinGW เวอร์ชันอนาคอนดาด้วย conda uninstall mingw โปรดทราบว่านี่จำเป็นเฉพาะในกรณีที่คุณเคยติดตั้ง MinGW ไว้ก่อนหน้านี้โดยใช้ conda

เมื่อเรียกใช้ f2py -c igrf12.pyf igrf12.f --compiler=mingw32 (ในไดเรกทอรีเดียวกันกับ igrf12.pyf โปรดดูที่ เอกสาร Scipy สำหรับวิธีสร้างไฟล์ *.pyf) pyigrf12.cp36-win_amd64.pyd ถูกสร้างขึ้นโดยไม่มีข้อผิดพลาดใดๆ ในที่สุดฉันก็สามารถ import pyigrf12 ได้สำเร็จและเข้าถึงรูทีนย่อย Fortran พื้นฐานได้ (เช่น igrf12syn)

โปรดทราบว่าฉันสามารถเรียกใช้ f2py -c igrf12.pyf igrf12.f --compiler=msvc ได้สำเร็จเช่นกัน แต่ฉันต้องคัดลอกและวาง libigrf12....gfortran-win_amd64.dll (สร้างใน .\UNKNOWN\.libs\) ด้วยตนเองลงในไดเรกทอรีเดียวกันกับ pyigrf12.cp36-win_amd64.pyd เพื่อหลีกเลี่ยง ImportError: DLL load failed: The specified module could not be found. ที่กล่าวถึงใน วิธีที่ 2 ของคำถามของฉัน

เพื่อย้ำอีกครั้ง: ตรวจสอบให้แน่ใจว่า C:\mingw64\bin ถูกเพิ่มในเส้นทางของคุณแล้ว!

อย่างไรก็ตาม f2py ไม่ลำบากสำหรับฉันบน macOS Sierra และ Ubuntu หากวิธีการข้างต้นยังไม่ได้ผลสำหรับคุณ ฉันขอแนะนำให้ลองใช้ Linux, macOS หรือ Windows Subsystem สำหรับ Linux

person dsholes    schedule 20.02.2018
comment
คำตอบของคุณช่วยฉันในการติดตั้ง Darkflow ของ Python ข้อผิดพลาดของฉันเกิดจาก c:\Rtools\mingw_32\bin\gcc.exe เช่นคอมไพเลอร์ 32 บิตพยายามสร้างบิลด์ 64 บิต การถอนการติดตั้ง Rtools ใช้งานได้ ไม่สามารถขอบคุณได้มากพอ ไชโย - person Lobbie; 29.03.2018
comment
เยี่ยมมาก ดีใจที่ช่วยได้! - person dsholes; 30.03.2018

ฉันมีปัญหาเดียวกัน คำตอบด้านบนช่วยได้มาก ฉันต้องการเพิ่มความคิดเห็นเกี่ยวกับ DLLs ที่หายไป เครื่องมือที่มีประโยชน์ที่จะช่วยคุณค้นหา DLL ที่ขาดหายไปคือ Process Monitor. คุณเพียงแค่ต้องเพิ่มตัวกรอง python.exe และติดตามว่า DLL ใดไม่สามารถโหลดได้ สำหรับฉันสิ่งต่อไปนี้หายไป:

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

ฉันแค่ต้องคัดลอกมันจากไดเร็กทอรี bin/ ของ Toolchain MinGW ของฉันไปยังไดเร็กทอรีเดียวกันของ python.exe

person Han Luo    schedule 15.09.2020

ฉันมีปัญหาเดียวกัน โดยเฉพาะ: ValueError: Symbol table not found ของวิธีที่ 3

คำตอบของ dsholes เป็นวิธีแก้ปัญหา บวก 2 ประเด็นย่อย:

  • ถอนการติดตั้ง minggw.x ทุกเวอร์ชัน
  • ดาวน์โหลด mingw64 (ในกรณีของฉัน: x86_64-8.1.0-posix-seh-rt_v6-rev0 ) ติดตั้ง
  • เพิ่ม mingw64/bin ไปยังเส้นทาง
  • จากนั้นการคอมไพล์ด้วย f2py -c fortran_file.F90 -m module_name --compiler=mingw32 ก็ทำงานได้ดีและสามารถนำเข้าได้อย่างถูกต้องใน Python: import module_name

อย่างไรก็ตาม:

  1. โมดูลของคุณควรรวบรวมในพาร์ติชัน windows เดียวกับที่ติดตั้ง Mingw32 อื่น (mingw ต่ำกว่า C:\ โครงการของฉันต่ำกว่า D:\ ฉันได้รับข้อผิดพลาดต่อไปนี้ เนื่องจากเส้นทางสัมพัทธ์ไม่ได้ถูกอ่านจากพาร์ติชันหนึ่งไปยังอีกพาร์ติชันหนึ่ง: f2py target file 'C:\\...' not generated

  2. ไฟล์ที่คอมไพล์อาจยังต้องการไลบรารีภายนอกบางส่วน ในกรณีของฉัน libquadmath-0.dll ใน mingw64\bin เป็นสิ่งจำเป็นและควรอยู่ใน PATH ตลอดเวลา มิฉะนั้น ฉันได้รับข้อผิดพลาดต่อไปนี้: ImportError: DLL load failed: ฉันลงเอยด้วยการระบุ dll เหล่านี้และคัดลอกมันภายในโปรเจ็กต์ของฉัน

person erwanp    schedule 04.07.2018