在f2py中设置fortran编译器

时间:2016-03-12 00:20:05

标签: python c compilation fortran f2py

我正在尝试运行f2py example来创建已编译的扩展模块¶:

# 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 <module>
    import add
ImportError: No module named add

P.S。 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 <module>
    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 "<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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据tutorial docs,使用f2py的一种简单方法是从命令行运行

f2py -c -m add add.f

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

import add

提供add.so位于sys.path

中列出的目录中