我有一段很长的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) 整数,intent(in):: n1,n2 double precision,intent(in):: in(n1,n2) 双精度,意图(out):: out(n2) 整数:: i2 做i2 = 1,n2 out(i2)= sum(in(:,i2)) ENDDO 返回 结束子程序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.pyfrom 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 chokes on,这在手动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']+[':'])])
这个简单的例子有效,并且通过类似的改变也可以使用更复杂的例子......
答案 0 :(得分:0)
太好了,使用f2py_options
的解决方案有效!
Extension(
name='module.routine_ext',
sources=['src/source_file.f'],
f2py_options=['only:', 'subroutine_name', ':'],
language='f77')