我想创建一个setup.py
文件,该文件自动将构建时依赖项解析为numpy(用于编译扩展)。我的第一个猜测是使用setup_requires
并将命令类子类化为导入numpy模块:
from setuptools import setup, Extension
from distutils.command.build import build as _build
class build(_build):
def run(self):
import numpy
print(numpy.get_include())
_build.run(self)
setup(
name='test',
version='0.0',
description='something',
cmdclass={'build':build},
setup_requires=['numpy'],
)
现在,运行python setup.py build
成功编译numpy但随后失败(在build.run
内):
AttributeError: 'module' object has no attribute 'get_include'
但是,如果再次运行相同的命令,该命令现在成功(并且不需要重新编译numpy)。
我已经在python {2.6,2.7,3.3}上测试了这个,有或没有virtualenv在最新版本的setuptools上。
我看到workaround using pkg_resources.resource_filename似乎工作得很好,如果我们想要的只是include目录。 编辑:仅适用于python2!
但是,我现在很好奇。 setup_requires
的使用有什么警告?可能是因为numpy无法正常工作的原因是什么?对于一些更简单的模块,似乎没有任何问题。
答案 0 :(得分:11)
想通过检查__NUMPY_SETUP__
内的numpy/__init__.py
来阻止numpy模块的正确初始化:
if __NUMPY_SETUP__:
import sys as _sys
_sys.stderr.write('Running from numpy source directory.\n')
del _sys
else:
# import subodules etc. (main branch)
安装后,setuptools不会重置此全局状态。以下作品:
...
def run(self):
__builtins__.__NUMPY_SETUP__ = False
import numpy
...