Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过setup.py在f2py中仅包含一些模块_Python_Distutils_F2py - Fatal编程技术网

Python 如何通过setup.py在f2py中仅包含一些模块

Python 如何通过setup.py在f2py中仅包含一些模块,python,distutils,f2py,Python,Distutils,F2py,我有一段很长的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_module

我有一段很长的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) 整数,意图(in)::n1,n2 双精度,意图(英寸):英寸(n1,n2) 双精度,意图(输出):输出(n2) 整数::i2 i2=1,n2吗 out(i2)=和(in(:,i2)) 结束循环 返回 结束子例程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。但是,如果我使用

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 :".
因此,错误越来越明显。 ... 事实上,通过进一步的谷歌搜索给出了答案;从…起 如果我改为

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']+[':'])])

简单的例子有效,而更复杂的改变也有效…

太好了,使用
f2py\u选项的解决方案有效

Extension(
    name='module.routine_ext',
    sources=['src/source_file.f'],
    f2py_options=['only:', 'subroutine_name', ':'],
    language='f77')

为什么它不起作用?错误是什么?由你的问题引发,我做了我本来应该做的事情:做一个简单的例子。如编辑的示例所示,这允许我进行故障排除并找到答案。不过还是要谢谢你!