首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >同时依赖于cython和f2py的包的setup.py

同时依赖于cython和f2py的包的setup.py
EN

Stack Overflow用户
提问于 2011-10-29 00:24:56
回答 2查看 2.2K关注 0票数 20

我想为一个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上应用补丁真的是一条可行的道路吗?

EN

回答 2

Stack Overflow用户

发布于 2011-12-15 03:42:34

您可以在setup.py中分别调用每一个,如下所示

http://answerpot.com/showthread.php?601643-cython%20and%20f2py

代码语言:javascript
复制
# 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()

票数 6
EN

Stack Overflow用户

发布于 2017-01-27 22:21:56

事实证明,这不再是真的。对于setuptoolsdistutils (至少是numpy版本),都可以使用C、Cython和f2py进行扩展。唯一需要注意的是,要编译f2py模块,必须始终对setupExtension函数使用numpy.distutils。但是仍然可以使用setuptools进行安装(例如,允许使用python setup.py develop安装开发人员版本)。

要以独占方式使用distutils,请使用以下命令:

代码语言:javascript
复制
from numpy.distutils.core import setup
from numpy.distutils.extension import Extension

要使用setuptools,您需要在distutils导入之前导入它:

代码语言:javascript
复制
import setuptools

然后剩下的代码是相同的:

代码语言:javascript
复制
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文件。根据需要进行调整。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7932028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档