我的设置如下:
- Python 3.6.3 | Anaconda custom(64位)|(默认值,2017年10月15日, 03:27:45)[MSC v.1900 64位(AMD64)]在win32上 - Windows 10企业版(版本1703) - NumPy 1.14.0
我按照SciPy文档和Dr.Michael Hirsch的有用指南中的f2py指导进行操作。Dr.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:使用mingw的anaconda版本和
--compiler = mingw32
- 方法4:使用mingw的anaconda版本和
--compiler = msvc
方法1:
背景:我在C:\ MinGW上安装了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
问题似乎涉及从python36.dll构建libpython36.a。
在快速谷歌搜索后,pywafo的github论坛上的建议是使用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
和
- 在.\UNKNOWN\.libs\
中的libigrf12.BMWM6WD5Y3O3UTOEQITBXCIICXVMBEZS.gfortran-win_amd64.dll
当我尝试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帖子似乎表明这是32位dll和64位Python之间冲突的问题。有人能提供关于这个问题的见解吗?经过更多搜索,我决定尝试使用mingw和libpython的anaconda版本。
方法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
现在问题似乎与从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扩展的背景,并且基于所有与Python 3.6 scipy和numpy安装有关的问题,似乎这是一个常见的问题,没有简单的解决方案。任何反馈或见解将不胜感激。