在f2py中设置fortran编译器

我试图运行f2py 示例来创建编译的扩展模块¶:

# import os # os.environ["CC"] = "gcc" # os.environ["CXX"] = "g++" # Using post-0.2.2 scipy_distutils to display fortran compilers from scipy_distutils.fcompiler import new_fcompiler compiler = new_fcompiler() # or new_fcompiler(compiler='intel') compiler.dump_properties() #Generate add.f wrapper from numpy import f2py with open("add.f") as sourcefile: sourcecode = sourcefile.read() print 'Fortran code' print sourcecode # f2py.compile(sourcecode, modulename='add', extra_args = '--compiler=gnu --fcompiler=gnu') f2py.compile(sourcecode, modulename='add', extra_args = '--fcompiler=gfortran') # f2py.compile(sourcecode, modulename='add') import add 

但是,代码不起作用。 我相信这是因为它没有使用安装的编译器(操作系统是ubuntu 12.04)。 但是,尽管使用“–fcompile”参数或更改“CC”和“CXX”条目,它仍然无法正常工作….

这是完整的错误日志。 欢迎任何建议:

 Could not locate executable g77 Could not locate executable f77 customize GnuFCompiler Could not locate executable ifort Could not locate executable ifc Could not locate executable efort Could not locate executable efc Could not locate executable ifort customize IntelFCompiler customize LaheyFCompiler customize PGroupFCompiler customize AbsoftFCompiler customize NAGFCompiler customize VastFCompiler customize GnuFCompiler customize CompaqFCompiler customize IntelItaniumFCompiler customize G95FCompiler customize GnuFCompiler GnuFCompiler instance properties: archiver = ['ar', '-cr'] compile_switch = '-c' compiler_f77 = ['f77', '-Wall', '-fno-second-underscore'] compiler_f90 = None compiler_fix = None libraries = [] library_dirs = [] linker_so = ['f77', '-Wall'] object_switch = '-o ' ranlib = ['ranlib'] version_cmd = ['f77', '--version'] Fortran code C SUBROUTINE ZADD(A,B,C,N) C DOUBLE COMPLEX A(*) DOUBLE COMPLEX B(*) DOUBLE COMPLEX C(*) INTEGER N DO 20 J = 1, N C(J) = A(J)+B(J) 20 CONTINUE END Unknown vendor: "gfortran" running build running config_cc unifing config_cc, config, build_clib, build_ext, build commands --compiler options running config_fc unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options running build_src build_src building extension "add" sources f2py options: [] f2py:> /tmp/tmpNKECn3/src.linux-x86_64-2.7/addmodule.c creating /tmp/tmpNKECn3/src.linux-x86_64-2.7 Reading fortran codes... Reading file '/tmp/tmpi2WwBV.f' (format:fix,strict) Post-processing... Block: add Block: zadd Post-processing (stage 2)... Building modules... Building module "add"... Constructing wrapper function "zadd"... getarrdims:warning: assumed shape array, using 0 instead of '*' getarrdims:warning: assumed shape array, using 0 instead of '*' getarrdims:warning: assumed shape array, using 0 instead of '*' zadd(a,b,c,n) Wrote C/API module "add" to file "/tmp/tmpNKECn3/src.linux-x86_64-2.7/addmodule.c" adding '/tmp/tmpNKECn3/src.linux-x86_64-2.7/fortranobject.c' to sources. adding '/tmp/tmpNKECn3/src.linux-x86_64-2.7' to include_dirs. copying /usr/local/lib/python2.7/dist-packages/numpy/f2py/src/fortranobject.c -> /tmp/tmpNKECn3/src.linux-x86_64-2.7 copying /usr/local/lib/python2.7/dist-packages/numpy/f2py/src/fortranobject.h -> /tmp/tmpNKECn3/src.linux-x86_64-2.7 build_src: building npy-pkg config files running build_ext customize UnixCCompiler customize UnixCCompiler using build_ext customize Gnu95FCompiler Found executable /usr/bin/gfortran Found executable /home/vital/Iraf/unix/hlib/f77.sh Found executable /usr/bin/ranlib customize Gnu95FCompiler using build_ext building 'add' extension compiling C sources C compiler: gfortran -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC creating /tmp/tmpNKECn3/tmp creating /tmp/tmpNKECn3/tmp/tmpNKECn3 creating /tmp/tmpNKECn3/tmp/tmpNKECn3/src.linux-x86_64-2.7 compile options: '-I/tmp/tmpNKECn3/src.linux-x86_64-2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c' gfortran: /tmp/tmpNKECn3/src.linux-x86_64-2.7/addmodule.c In file included from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarraytypes.h:1781:0, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarrayobject.h:18, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h:4, from /tmp/tmpNKECn3/src.linux-x86_64-2.7/fortranobject.h:13, from /tmp/tmpNKECn3/src.linux-x86_64-2.7/addmodule.c:19: /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] #warning "Using deprecated NumPy API, disable it by " \ ^ /tmp/tmpNKECn3/src.linux-x86_64-2.7/addmodule.c:105:12: warning: 'f2py_size' defined but not used [-Wunused-function] static int f2py_size(PyArrayObject* var, ...) ^ gfortran: /tmp/tmpNKECn3/src.linux-x86_64-2.7/fortranobject.c In file included from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarraytypes.h:1781:0, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarrayobject.h:18, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h:4, from /tmp/tmpNKECn3/src.linux-x86_64-2.7/fortranobject.h:13, from /tmp/tmpNKECn3/src.linux-x86_64-2.7/fortranobject.c:2: /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] #warning "Using deprecated NumPy API, disable it by " \ ^ compiling Fortran sources Fortran f77 compiler: /home/vital/Iraf/unix/hlib//f77.sh -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops Fortran f90 compiler: /usr/bin/gfortran -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops Fortran fix compiler: /usr/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops compile options: '-I/tmp/tmpNKECn3/src.linux-x86_64-2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c' f77.sh:f77: /tmp/tmpi2WwBV.f Cannot open file tmpi2WwBV.f gcc: error: tmpi2WwBV.c: No such file or directory gcc: fatal error: no input files compilation terminated. Cannot open file tmpi2WwBV.f gcc: error: tmpi2WwBV.c: No such file or directory gcc: fatal error: no input files compilation terminated. error: Command "/home/vital/Iraf/unix/hlib//f77.sh -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops -I/tmp/tmpNKECn3/src.linux-x86_64-2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c -c /tmp/tmpi2WwBV.f -o /tmp/tmpNKECn3/tmp/tmpi2WwBV.o" failed with exit status 4 Traceback (most recent call last): File "/home/vital/git/pyResources/pyResources/Tutorials/test_f2py.py", line 21, in  import add ImportError: No module named add 

PS Iraf是一个天文软件而不是编译器。

编辑1:

使用jthomas建议的正确导入我得到一个更短的错误,但它仍然试图使用IRAF文件夹中的脚本。 这是使用该代码的完整错误消息:

 Gnu95FCompiler instance properties: compile_switch = '-c' libraries = [] library_dirs = [] object_switch = '-o ' Fortran code C SUBROUTINE ZADD(A,B,C,N) C DOUBLE COMPLEX A(*) DOUBLE COMPLEX B(*) DOUBLE COMPLEX C(*) INTEGER N DO 20 J = 1, N C(J) = A(J)+B(J) 20 CONTINUE END Unknown vendor: "gfortran" running build running config_cc unifing config_cc, config, build_clib, build_ext, build commands --compiler options running config_fc unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options running build_src build_src building extension "add" sources f2py options: [] f2py:> /tmp/tmp_KRxI5/src.linux-x86_64-2.7/addmodule.c creating /tmp/tmp_KRxI5/src.linux-x86_64-2.7 Reading fortran codes... Reading file '/tmp/tmph5mvme.f' (format:fix,strict) Post-processing... Block: add Block: zadd Post-processing (stage 2)... Building modules... Building module "add"... Constructing wrapper function "zadd"... getarrdims:warning: assumed shape array, using 0 instead of '*' getarrdims:warning: assumed shape array, using 0 instead of '*' getarrdims:warning: assumed shape array, using 0 instead of '*' zadd(a,b,c,n) Wrote C/API module "add" to file "/tmp/tmp_KRxI5/src.linux-x86_64-2.7/addmodule.c" adding '/tmp/tmp_KRxI5/src.linux-x86_64-2.7/fortranobject.c' to sources. adding '/tmp/tmp_KRxI5/src.linux-x86_64-2.7' to include_dirs. copying /usr/local/lib/python2.7/dist-packages/numpy/f2py/src/fortranobject.c -> /tmp/tmp_KRxI5/src.linux-x86_64-2.7 copying /usr/local/lib/python2.7/dist-packages/numpy/f2py/src/fortranobject.h -> /tmp/tmp_KRxI5/src.linux-x86_64-2.7 build_src: building npy-pkg config files running build_ext customize UnixCCompiler customize UnixCCompiler using build_ext customize Gnu95FCompiler Found executable /usr/bin/gfortran Found executable /home/vital/Iraf/unix/hlib/f77.sh Found executable /usr/bin/ranlib customize Gnu95FCompiler using build_ext building 'add' extension compiling C sources C compiler: gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC creating /tmp/tmp_KRxI5/tmp creating /tmp/tmp_KRxI5/tmp/tmp_KRxI5 creating /tmp/tmp_KRxI5/tmp/tmp_KRxI5/src.linux-x86_64-2.7 compile options: '-I/tmp/tmp_KRxI5/src.linux-x86_64-2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c' gcc: /tmp/tmp_KRxI5/src.linux-x86_64-2.7/addmodule.c In file included from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarraytypes.h:1781:0, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarrayobject.h:18, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h:4, from /tmp/tmp_KRxI5/src.linux-x86_64-2.7/fortranobject.h:13, from /tmp/tmp_KRxI5/src.linux-x86_64-2.7/addmodule.c:19: /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] #warning "Using deprecated NumPy API, disable it by " \ ^ /tmp/tmp_KRxI5/src.linux-x86_64-2.7/addmodule.c:105:12: warning: 'f2py_size' defined but not used [-Wunused-function] static int f2py_size(PyArrayObject* var, ...) ^ gcc: /tmp/tmp_KRxI5/src.linux-x86_64-2.7/fortranobject.c In file included from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarraytypes.h:1781:0, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarrayobject.h:18, from /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h:4, from /tmp/tmp_KRxI5/src.linux-x86_64-2.7/fortranobject.h:13, from /tmp/tmp_KRxI5/src.linux-x86_64-2.7/fortranobject.c:2: /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] #warning "Using deprecated NumPy API, disable it by " \ ^ compiling Fortran sources Fortran f77 compiler: /home/vital/Iraf/unix/hlib//f77.sh -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops Fortran f90 compiler: /usr/bin/gfortran -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops Fortran fix compiler: /usr/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops compile options: '-I/tmp/tmp_KRxI5/src.linux-x86_64-2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c' f77.sh:f77: /tmp/tmph5mvme.f Cannot open file tmph5mvme.f gcc: error: tmph5mvme.c: No such file or directory gcc: fatal error: no input files compilation terminated. Cannot open file tmph5mvme.f gcc: error: tmph5mvme.c: No such file or directory gcc: fatal error: no input files compilation terminated. error: Command "/home/vital/Iraf/unix/hlib//f77.sh -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops -I/tmp/tmp_KRxI5/src.linux-x86_64-2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include/python2.7 -c -c /tmp/tmph5mvme.f -o /tmp/tmp_KRxI5/tmp/tmph5mvme.o" failed with exit status 4 Traceback (most recent call last): File "/home/vital/git/pyResources/pyResources/Tutorials/test_f2py.py", line 42, in  import add ImportError: No module named add 

编辑2:当将扩展名更改为.f90并定义fortran编译器位置(使用whereis)时,我收到以下错误:

 Gnu95FCompiler instance properties: compile_switch = '-c' libraries = [] library_dirs = [] object_switch = '-o ' Fortran code C SUBROUTINE ZADD(A,B,C,N) C DOUBLE COMPLEX A(*) DOUBLE COMPLEX B(*) DOUBLE COMPLEX C(*) INTEGER N DO 20 J = 1, N C(J) = A(J)+B(J) 20 CONTINUE END Unknown vendor: "/usr/bin/gfortran" running build running config_cc unifing config_cc, config, build_clib, build_ext, build commands --compiler options running config_fc unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options running build_src build_src building extension "add" sources f2py options: [] f2py:> /tmp/tmpHgqM4n/src.linux-x86_64-2.7/addmodule.c creating /tmp/tmpHgqM4n/src.linux-x86_64-2.7 Reading fortran codes... Reading file '/tmp/tmpiLO46g.f' (format:fix,strict) Post-processing... Block: add Block: zadd Post-processing (stage 2)... Building modules... Building module "add"... Constructing wrapper function "zadd"... getarrdims:warning: assumed shape array, using 0 instead of '*' getarrdims:warning: assumed shape array, using 0 instead of '*' getarrdims:warning: assumed shape array, using 0 instead of '*' zadd(a,b,c,n) Wrote C/API module "add" to file "/tmp/tmpHgqM4n/src.linux-x86_64-2.7/addmodule.c" adding '/tmp/tmpHgqM4n/src.linux-x86_64-2.7/fortranobject.c' to sources. adding '/tmp/tmpHgqM4n/src.linux-x86_64-2.7' to include_dirs. copying /usr/local/lib/python2.7/dist-packages/numpy/f2py/src/fortranobject.c -> /tmp/tmpHgqM4n/src.linux-x86_64-2.7 copying /usr/local/lib/python2.7/dist-packages/numpy/f2py/src/fortranobject.h -> /tmp/tmpHgqM4n/src.linux-x86_64-2.7 build_src: building npy-pkg config files running build_ext customize UnixCCompiler customize UnixCCompiler using build_ext don't know how to compile Fortran code on platform 'posix' with '/usr/bin/gfortran' compiler. Supported compilers are: g95,compaq,none,intele,ibm,gnu,mips,lahey,nag,pathf95,intelem,gnu95,intelv,intelvem,absoft,intelev,pg,sun,hpux,vast,intel) warning: build_ext: f77_compiler=/usr/bin/gfortran is not available. building 'add' extension error: extension 'add' has Fortran sources but no Fortran compiler found 

编辑3:

使用参数:

 f2py.compile(sourcecode, modulename='add', extra_args = '-c --help-fcompiler') 

我得到以下输出:

 Gnu95FCompiler instance properties: archiver = ['/usr/bin/gfortran', '-cr'] compile_switch = '-c' compiler_f77 = ['/home/vital/Iraf/unix/hlib//f77.sh', '-Wall', '-g', '- ffixed-form', '-fno-second-underscore', '-fPIC', '-O3', '- funroll-loops'] compiler_f90 = ['/usr/bin/gfortran', '-Wall', '-g', '-fno-second- underscore', '-fPIC', '-O3', '-funroll-loops'] compiler_fix = ['/usr/bin/gfortran', '-Wall', '-g', '-ffixed-form', '- fno-second-underscore', '-Wall', '-g', '-fno-second- underscore', '-fPIC', '-O3', '-funroll-loops'] libraries = ['gfortran'] library_dirs = [] linker_exe = ['/usr/bin/gfortran', '-Wall', '-Wall'] linker_so = ['/usr/bin/gfortran', '-Wall', '-g', '-Wall', '-g', '- shared'] object_switch = '-o ' ranlib = ['/usr/bin/ranlib'] version = LooseVersion ('4.8') version_cmd = ['/usr/bin/gfortran', '-dumpversion'] Traceback (most recent call last): File "", line 1, in  File "/usr/local/lib/python2.7/dist-packages/numpy/f2py/f2py2e.py", line 648, in main run_compile() File "/usr/local/lib/python2.7/dist-packages/numpy/f2py/f2py2e.py", line 633, in run_compile setup(ext_modules=[ext]) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/core.py", line 169, in setup return old_setup(**new_attr) File "/usr/lib/python2.7/distutils/core.py", line 137, in setup ok = dist.parse_command_line() File "/usr/lib/python2.7/distutils/dist.py", line 467, in parse_command_line args = self._parse_command_opts(parser, args) File "/usr/lib/python2.7/distutils/dist.py", line 576, in _parse_command_opts func() File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/command/config_compiler.py", line 15, in show_fortran_compilers show_fcompilers(dist) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/__init__.py", line 889, in show_fcompilers c.customize(dist) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/__init__.py", line 502, in customize get_flags('opt', oflags) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/__init__.py", line 493, in get_flags flags.extend(getattr(self.flag_vars, tag)) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/environment.py", line 39, in __getattr__ return self._get_var(name, conf_desc) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/environment.py", line 53, in _get_var var = self._hook_handler(name, hook) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/__init__.py", line 700, in _environment_hook return hook() File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/gnu.py", line 206, in get_flags_opt v = self.get_version() File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/__init__.py", line 432, in get_version version = CCompiler.get_version(self, force=force, ok_status=ok_status) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/ccompiler.py", line 491, in CCompiler_get_version version = matcher(output) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/gnu.py", line 79, in version_match v = self.gnu_version_match(version_string) File "/usr/local/lib/python2.7/dist-packages/numpy/distutils/fcompiler/gnu.py", line 76, in gnu_version_match raise ValueError(err + version_string) ValueError: A valid Fortran version was not found in this string: invalid parameter -dumpversion 

根据教程文档 ,使用f2py的一种简单方法是从命令行运行

 f2py -c -m add add.f 

这将创建模块文件add.so (或add.pyd ,具体取决于您的操作系统),可以将其导入到Python脚本中

 import add 

如果add.so位于sys.path列出的目录中。

f2py现在作为numpy的一部分维护。 如下改变你的例子编译就好了。

 # import os # os.environ["CC"] = "gcc" # os.environ["CXX"] = "g++" # Using post-0.2.2 scipy_distutils to display fortran compilers from numpy.distutils.fcompiler import new_fcompiler compiler = new_fcompiler() # or new_fcompiler(compiler='intel') compiler.dump_properties() #Generate add.f wrapper from numpy import f2py with open("add.f") as sourcefile: sourcecode = sourcefile.read() print 'Fortran code' print sourcecode # f2py.compile(sourcecode, modulename='add', extra_args = '--compiler=gnu --fcompiler=g$ f2py.compile(sourcecode, modulename='add', extra_args = '--fcompiler=gfortran') # f2py.compile(sourcecode, modulename='add') import add