2014-02-06 23 views
7

我想創建一個setup.py文件,該文件自動將構建時間依賴性解析爲numpy(用於編譯擴展)。我的第一個猜測是使用setup_requires和子命令類導入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}上測試了這個,在最近的版本setuptools上有和沒有virtualenv。

我看到一個workaround using pkg_resources.resource_filename這似乎工作得很好,如果我們只想要的是包括目錄。 編輯只適用於python2!

但是,我現在好奇。 setup_requires的用法有哪些注意事項?可能是因爲它不能正常工作的原因是什麼?對於一些更簡單的模塊,它似乎沒有問題。

回答

7

想通了,該numpy的模塊的正確初始化被檢查爲防止內部__NUMPY_SETUP__numpy/__init__.py

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 
    ...