使用setup.py为既依赖于Cython又依赖于f2py的包进行设置

20

我希望创建一个setup.py脚本,对一个包含多个子模块的Python程序进行打包,并且这些子模块需要依赖于cython和f2py。我尝试使用setuptools和numpy.distutils,但是一直没有成功:

使用setuptools

使用setuptools,我能够编译我的cython扩展(并创建其余包的安装),但无法弄清楚如何使用setuptools来生成f2py扩展。经过广泛搜索,我只找到了相当古老的类似于这样的消息,指出必须使用numpy.distutils来编译f2py模块。

使用numpy.distutils

使用numpy.distutils,我能够编译我的f2py扩展(并创建其余包的安装),但无法弄清楚如何让numpy.distutils编译我的cython扩展。因为它总是尝试使用pyrex进行编译(而我正在使用特定于cython的扩展)并在最近一年内做过搜索,想要获取用于cython文件的numpy.distutils -至少截至一年前-他们建议对numpy.distutils应用monkey patch。看起来应用这样的monkey patch也会限制传递给Cython的选项。

我的问题是:编写依赖于f2py和cython两者的软件包的setup.py脚本的推荐方法是什么?还需要对numpy.distutils应用补丁吗?

2个回答

6
您可以在setup.py中分别调用它们,例如:
http://answerpot.com/showthread.php?601643-cython%20and%20f2py
# Cython extension
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  ext_modules = [Extension( 'cext', ['cext.pyx'] )],
  cmdclass = {'build_ext': build_ext},
  script_args = ['build_ext', '--inplace'],
)

# Fortran extension
from numpy.distutils.core import setup, Extension
setup(
  ext_modules = [Extension( 'fext', ['fext.f90'] )],
)

您的调用上下文(我想他们称之为名称空间,不确定)
必须根据当前对象Extension和函数setup()的设置而更改。

第一个setup()调用是distutils.extension.Extension
以及distutils.core.setup()。

第二个setup()调用是numpy.distutils.core.Extension
以及numpy.distutils.core.setup()。


2
很不幸,answerpot.com的链接已经失效了。不过还是谢谢你的回答! :-) - AdrianO

3
原来这个说法不再正确。使用setuptoolsdistutils(至少是numpy版本),可以使用C、Cython和f2py扩展。唯一需要注意的是,为了编译f2py模块,必须始终在setupExtension函数中使用numpy.distutils。但是,setuptools仍然可以用于安装(例如,允许使用python setup.py develop安装开发人员版本)。
要仅使用distutils,请使用以下命令:
from numpy.distutils.core import setup
from numpy.distutils.extension import Extension

为了使用setuptools,你需要在distutils导入之前先导入它:
import setuptools

然后代码的其余部分相同:

from numpy import get_include
from Cython.Build import cythonize

NAME = 'my_package'
NUMPY_INC = get_include()
extensions = [
    Extension(name=NAME + ".my_cython_ext", 
              include_dirs=[NUMPY_INC, "my_c_dir"]
              sources=["my_cython_ext.pyx", "my_c_dir/my_ext_c_file.c"]),
    Extension(name=NAME + ".my_f2py_ext", 
              sources=["my_f2py_ext.f"]),
]
extensions = cythonize(extensions)
setup(..., ext_modules=extensions)

很明显,你需要把所有其他的东西放在 setup() 调用里。在上面的代码中,我假设你会在Cython中使用numpy,并且有一个外部的C文件 (my_ext_c_file.c) 放在 my_c_dir/,并且 f2py 模块只有一个Fortran文件。根据需要进行调整。


我也遇到了类似的问题。但是,在运行 sudo python3 setup.py install 后,我收到了“错误:未知文件类型 '.f95'(来自'Resource_dependency.f95')”的信息。请问能否指引我一下? - Peaceful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接