我想为一个python包创建一个setup.py脚本,其中包含几个同时依赖于cython和f2py的子模块。我尝试过使用setuptools和numpy.distutils,但到目前为止都失败了:
使用setuptools
我能够使用setuptools编译我的cython扩展(并为包的其余部分创建一个安装程序)。然而,我一直不知道如何使用setuptools来生成f2py扩展。经过广泛的搜索,我只找到了相当旧的messages like this one,它规定必须使用numpy.distutils编译f2py模块。
使用numpy.distutils
我能够使用numpy.distutils编译我的f2py扩展(并为包的其余部分创建一个安装)。然而,我一直不知道如何让numpy.distutils编译我的cython扩展,因为它最近总是试图使用pyrex来编译它(而我正在使用特定于cython的扩展)。我已经搜索过如何获取cython文件的numpy.distutils,并且--至少一年前--他们建议对numpy.distutils应用monkey patch。似乎应用这样的猴子补丁也限制了可以传递给Cython的选项。
我的问题是:为同时依赖于f2py和cython的包编写setup.py脚本的推荐方式是什么?在numpy.distutils上应用补丁真的是一条可行的道路吗?
发布于 2011-12-15 03:42:34
您可以在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()
发布于 2017-01-27 22:21:56
事实证明,这不再是真的。对于setuptools
和distutils
(至少是numpy
版本),都可以使用C、Cython和f2py进行扩展。唯一需要注意的是,要编译f2py模块,必须始终对setup
和Extension
函数使用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()
调用中。在上面的代码中,我假设您将使用numpy和Cython,以及一个位于my_c_dir/
的外部C文件(my_ext_c_file.c
),并且f2py
模块只是一个Fortran文件。根据需要进行调整。
https://stackoverflow.com/questions/7932028
复制相似问题