繁体   English   中英

setup.py适用于依赖于cython和f2py的软件包

[英]setup.py for packages that depend on both cython and f2py

我想为python包创建一个setup.py脚本,其中包含几个依赖于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。 似乎应用这样的猴子补丁也限制了可以传递给Cython的选项。

我的问题是:为依赖于f2py和cython的软件包编写setup.py脚本的推荐方法是什么? 是否应用numpy.distutils补丁真的要走了吗?

您可以在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()

原来这不再是真的。 使用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()调用中。 在上面我假设你将使用numpy和Cython,以及将在my_c_dir/的外部C文件( my_ext_c_file.c ),并且f2py模块只是一个Fortran文件。 根据需要调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM