我想为python包创建一个setup.py脚本,其中包含几个依赖于cython和f2py的子模块。我试图使用setuptools和numpy.distutils,但到目前为止失败了:
我可以使用setuptools编译我的cython扩展(并为包的其余部分创建安装)。但是,我无法弄清楚如何使用setuptools来生成f2py扩展。经过广泛的搜索,我发现相当古老的messages like this one表明必须使用numpy.distutils编译f2py模块。
我可以使用numpy.distutils编译我的f2py扩展(并为包的其余部分创建安装)。但是,我一直无法弄清楚如何让numpy.distutils编译我的cython扩展,因为它总是尝试使用pyrex来编译它(我使用的是特定于cython的扩展)。我已经做了一个搜索来弄清楚如何为cython文件获取numpy.distutils,并且 - 至少在一年前 - 他们建议将monkey patch应用于numpy.distutils。似乎应用这样的猴子补丁也限制了可以传递给Cython的选项。
我的问题是:为依赖于f2py和cython的软件包编写setup.py脚本的推荐方法是什么?将补丁应用到numpy.distutils真的是要走的路吗?
答案 0 :(得分:4)
您可以在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'] )],
)
你的调用上下文(我认为他们称之为命名空间,不确定)
必须改变当前对象的扩展和功能
setup()是。
第一次setup()调用,它是distutils.extension.Extension
和distutils.core.setup()
第二次setup()调用,它是numpy.distutils.core.Extension
和numpy.distutils.core.setup()
答案 1 :(得分:2)
原来这不再是真的。对于setuptools
和distutils
(至少numpy
版本),可以使用C,Cython和f2py进行扩展。唯一需要注意的是,要编译f2py模块,必须始终对numpy.distutils
和setup
函数使用Extension
。但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()
来电。在上面我假设您将使用Numpy与Cython,以及将在my_ext_c_file.c
的外部C文件(my_c_dir/
),并且f2py
模块只是一个Fortran文件。根据需要调整。