Windows 10 在Windows 10上使用f2py和Python 3.6编译fortran模块

Windows 10 在Windows 10上使用f2py和Python 3.6编译fortran模块,windows-10,anaconda,mingw,python-3.6,f2py,Windows 10,Anaconda,Mingw,Python 3.6,F2py,我正在尝试(但失败)在Windows10上使用f2py和Python3.6编译fortran模块(特别是来自BGS)。Python是使用Anaconda4.4.10安装的 我的设置: Python 3.6.3 | Anaconda定制(64位)|(默认值,2017年10月15日), win32上的[MSC v.1900 64位(AMD64)] Windows 10企业版(1703版) NumPy 1.14.0 我听从了医生的指示和迈克尔·赫希博士的指导。Hirsch博士创建了pyigrf12

我正在尝试(但失败)在Windows10上使用f2py和Python3.6编译fortran模块(特别是来自BGS)。Python是使用Anaconda4.4.10安装的

我的设置:

  • Python 3.6.3 | Anaconda定制(64位)|(默认值,2017年10月15日), win32上的[MSC v.1900 64位(AMD64)]
  • Windows 10企业版(1703版)
  • NumPy 1.14.0
我听从了医生的指示和迈克尔·赫希博士的指导。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:使用anaconda版本的mingw和
    --compiler=mingw32
  • 方法4:使用anaconda版本的mingw和
    --compiler=msvc
方法1:

在后台,我在C:\MinGW上有MinGW,并将C:\MinGW\bin添加到我的用户路径中。不幸的是,我没有安装这个版本的MinGW(我从一位同事那里继承了这台计算机),所以我不知道它的来源。gcc——版本和gfortran——版本是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
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有关。再一次,objdump.exe无法识别dll文件格式

方法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相关的问题,这似乎是一个没有简单解决方案的常见问题


任何反馈或见解都将不胜感激。

最终实现了这一目标

短版:

确保对64位Python使用64位编译器(对mingw-w64的构建进行三次检查)。不像Windows上的
f2py
newb听起来那么明显

长版本:

我卸载了我现有的MinGW副本(我怀疑它是32位版本),而是下载了一个特定的64位版本,特别是
x86\u 64-7.2.0-release-posix-seh-rt\u v5-rev1.7z
。这是有用的

我解压缩并将“mingw64”文件夹复制到我的C:drive(
C:\mingw64
)中。我在我的用户路径中添加了
C:\mingw64\bin

我用
conda uninstall MinGW
卸载了anaconda版本的MinGW。注意,仅当您以前使用
conda
安装了MinGW时,才需要此选项

运行
f2py-c igrf12.pyf igrf12.f--compiler=mingw32
(在与igrf12.pyf相同的目录中,请参阅如何生成*.pyf文件)时,将创建
pyigrf12.cp36-win_amd64.pyd
。我终于可以
成功导入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加载失败:找不到指定的模块。
在我的问题的方法2中提到

只需重新迭代:确保将
C:\mingw64\bin
添加到您的路径中


顺便说一句,
f2py
在macOS Sierra和Ubuntu上对我来说毫无痛苦。如果上述方法仍然不适用于您,我建议您在Linux、macOS或Windows Subsystem for Linux上进行尝试。

我也遇到同样的问题,特别是方法3的:
ValueError:Symbol table not found

是解决方案,加上2个小点:

  • 卸载所有版本的minggw
  • 下载mingw64(在我的例子中:
    x86\u 64-8.1.0-posix-seh-rt\u v6-rev0
    ),安装它
  • mingw64/bin
    添加到路径
  • 然后使用
    f2py-c fortran_file.F90-m module_name进行编译--编译器=mingw32
    
    运行良好,可以在Python中正确导入:
    import module\u name
然而:

  • 您的模块应在安装Mingw32的同一windows分区中编译。否则(mingw在
    C:\
    下,我的项目在
    D:\
    下),由于没有从一个分区读取到另一个分区的相对路径,我得到以下错误:
    f2py目标文件“C:\\…”没有生成

  • 编译后的文件可能仍然需要一些外部库。在我的情况下,需要mingw64\bin中的
    libquadmath-0.dll
    ,并且应该始终保留在路径中。否则,我会遇到以下错误:
    ImportError:dll加载失败:
    。我最终识别了这些dll,并将它们复制到我的项目中


  • 我也有同样的问题。上面的答案帮助很大。我想添加一些关于缺少的DLL的注释。帮助您找出缺少哪些DLL的有用工具是。您只需添加一个过滤器
    python.exe
    ,并跟踪哪些DLL加载失败。对于我来说,缺少以下内容:

    • libgcc_s_seh-1。