我有一个项目,它有一个 C 扩展,需要 numpy。理想情况下,我希望下载我的项目的人都能够运行python setup.py install
或使用一个电话pip
。我遇到的问题是在我的setup.py
我需要导入 numpy 来获取标题的位置,但我希望 numpy 只是一个常规要求install_requires
这样它就会自动从Python包索引下载。
这是我正在尝试做的事情的示例:
from setuptools import setup, Extension
import numpy as np
ext_modules = [Extension('vme', ['vme.c'], extra_link_args=['-lvme'],
include_dirs=[np.get_include()])]
setup(name='vme',
version='0.1',
description='Module for communicating over VME with CAEN digitizers.',
ext_modules=ext_modules,
install_requires=['numpy','pyzmq', 'Sphinx'])
显然,我不能import numpy
在安装之前位于顶部。我见过一个setup_requires
参数传递给setup()
但找不到任何有关其用途的文档。
这可能吗?
以下至少适用于 numpy1.8 和 python{2.6,2.7,3.3}:
from setuptools import setup
from setuptools.command.build_ext import build_ext as _build_ext
class build_ext(_build_ext):
def finalize_options(self):
_build_ext.finalize_options(self)
# Prevent numpy from thinking it is still in its setup process:
__builtins__.__NUMPY_SETUP__ = False
import numpy
self.include_dirs.append(numpy.get_include())
setup(
...
cmdclass={'build_ext':build_ext},
setup_requires=['numpy'],
...
)
有关一个小解释,请参阅为什么它在没有“hack”的情况下失败,请参阅这个答案 https://stackoverflow.com/a/21621493/650222.
请注意,使用setup_requires
有一个微妙的缺点:numpy 不仅会在构建扩展之前进行编译,而且还会在执行时进行编译python setup.py --help
, 例如。为了避免这种情况,您可以检查命令行选项,如建议的那样https://github.com/scipy/scipy/blob/master/setup.py#L205 https://github.com/scipy/scipy/blob/9ccc68475fc431c4a44c120693cf6878cc4c14a7/setup.py#L205,但另一方面,我真的认为这不值得付出努力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)