1

我有一段很长的 fortran 代码,其中一些部分我想暴露给 python。它可以从命令行正常工作,与

f2py -m extrpsf -c extract_psf.f95 only: extract_psf psfmany :

我希望分发这个,所以我试图让它与 numpy.distutils.core 一起工作。我认为以下应该有效:

from numpy.distutils.core import setup, Extension
setup(name="extrpsf",
ext_modules=[Extension(name='extrpsf', sources=['extract_psf.f95'],
                       f2py_options=['only: extract_psf psfmany :'])])

不幸的是,这不起作用。有什么建议么?

很抱歉之前没有提供有关错误消息的详细信息。我现在做了我之前应该做的事情并简化了问题。因此,假设我有以下 fortran 代码 add_test.f95 子程序 add_axis2(in, n1, n2, out) integer, intent(in) :: n1, n2 double precision, intent(in) :: in(n1, n2) double精度,intent(out) :: out(n2) integer :: i2 do i2 = 1,n2 out(i2) = sum(in(:,i2)) enddo return end subroutine add_axis2

subroutine add_axis1(in, n1, n2, out)
  integer, intent(in) :: n1, n2
  double precision, intent(in) :: in(n1, n2)
  double precision, intent(out) :: out(n1)
  integer :: i1
  do i1 = 1,n1
     out(i1) = sum(in(i1,:))
  enddo
  return
end subroutine add_axis1

然后,如果我跑

f2py -m add_test -c add_test.f95 only: add_axis1 :

我得到一个 add_test.so,如果我导入它,它只有 add_axis1。但是,如果我使用 setup.py

from numpy.distutils.core import setup, Extension
setup(name="add_test",
      ext_modules=[Extension(name='add_test', sources=['add_test.f95'],
                             f2py_options=['only: add_axis2 :'])])

并运行

python setup.py build

结果 add_test.so 仍然有两个子例程。(这也解释了我之前收到的错误消息;我的较长代码中有部分 f2py 阻塞,在手动 f2py 调用中简单地被跳过)。所以,我想我的问题已经简化为我如何在 setup.py 中确保只制作一些例程。

更详细地查看输出,我看到

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_test" sources
f2py options: ['only: add_axis2 :']
f2py:> build/src.linux-x86_64-2.7/add_testmodule.c
creating build
creating build/src.linux-x86_64-2.7
IOError: [Errno 2] No such file or directory: 'only: add_axis2 :'. Skipping file "only: add_axis2 :".

所以错误越来越清楚。...确实,通过进一步的谷歌搜索给出了答案;来自 http://cens.ioc.ee/pipermail/f2py-users/2005-July/001125.html 如果我这样做

from numpy.distutils.core import setup, Extension
setup(name="add_test",
      ext_modules=[Extension(name='add_test', sources=['add_test.f95'],
                             f2py_options=['only:']+['add_axis2']+[':'])])

简单的示例有效,并且通过类似的更改,更复杂的示例也有效...

4

1 回答 1

0

太好了,使用的解决方案f2py_options有效!

Extension(
    name='module.routine_ext',
    sources=['src/source_file.f'],
    f2py_options=['only:', 'subroutine_name', ':'],
    language='f77')
于 2018-11-21T14:18:18.567 回答