问题
I am trying to run the f2py example to create the compiled extension module¶:
# 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
However, the code does not work. I believe it is because it is not using the compiler installed (Operative system is ubuntu 12.04). However, despite using the "--fcompile" argument or changing the "CC" and "CXX" entries it is still not working....
This is the complete error log. Please any advice would be most welcome:
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 <module>
import add
ImportError: No module named add
P.S. Iraf is an astronomical software not a compiler.
Edit 1:
Using the correct import as suggested by jthomas I get a shorter error but still it is trying to use the script in the IRAF folder. This is the complete error message using that code:
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 <module>
import add
ImportError: No module named add
EDIT 2: When changing the extension to .f90 and defining the fortran compiler location (using whereis) I get the following error:
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
EDIT 3:
Using the arguments:
f2py.compile(sourcecode, modulename='add', extra_args = '-c --help-fcompiler')
I get the following output:
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 "<string>", line 1, in <module>
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
回答1:
Per the tutorial docs, an easy way to use f2py is to run from the command line
f2py -c -m add add.f
This creates the module file add.so
(or add.pyd
, depending on your OS), which can be imported into Python scripts with
import add
provided add.so
is in a directory listed in sys.path
.
回答2:
f2py is now maintained as part of numpy. Altering your example as follows compiles just fine.
# 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
来源:https://stackoverflow.com/questions/35952163/setting-the-fortran-compiler-in-f2py