2013-07-16 14 views
4

我有一個setup.py看起來是這樣的:使用的distutils這裏痛飲接口文件是在src文件夾

from setuptools import setup, Extension 
import glob 

sources = glob.glob('src/*.cpp') + glob.glob('src/*.i') 
# this is ugly, but otherwise I get the wrapper included twice 
sources = [source for source in sources if '_wrap' not in source] 
setup(
    name = 'engine', 
    ext_modules = [ 
     Extension(
      '_engine', 
      sources = sources, 
      swig_opts = ['-c++'], 
      include_dirs = ['src'] 
     ) 
    ], 
    py_modules = ['engine'] 
    package_dir = {'' : 'src'} 
) 

現在我跑install兩次這種工作方式長。第一次,swig在src目錄中創建engine.py。但它不會被複制到目標。第二次運行setup.py文件時,發現並安裝了engine.py。有沒有辦法讓這一切都第一次工作?

+0

我有一個比你更簡單的設置,但我發現我必須這樣做。一個「解決方法」是首先運行構建,然後安裝,但所有這些都會生成swig包裝器,以便安裝可以看到它。它會在安裝階段被複制,而不是構建。 –

回答

2

我確實認爲這應該是開箱即用的,並且會認爲它是一個錯誤。

讓這個工作起作用的一個選擇是簡單地改變事物構建的順序。默認情況下,setup.py將首先收集python模塊,然後構建任何外部軟件包。

您可以通過子類的默認build類更改構建順序,然後要求setup.py通過cmdclass選項來使用您的自定義build類。

from setuptools import setup, Extension 
from distutils.command.build import build as _build 

#Define custom build order, so that the python interface module 
#created by SWIG is staged in build_py. 
class build(_build): 
    # different order: build_ext *before* build_py 
    sub_commands = [('build_ext',  _build.has_ext_modules), 
        ('build_py',  _build.has_pure_modules), 
        ('build_clib', _build.has_c_libraries), 
        ('build_scripts', _build.has_scripts), 
        ] 

setup(
    name = 'engine', 
    cmdclass = {'build': build }, #Use your own build class 
    ext_modules = [Extension('_engine', 
          sources = sources, 
          swig_opts = ['-c++'], 
          include_dirs = ['src'] 
        )], 
    ...