我有一个看起来像这样的setup.py:
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 :(得分:2)
我同意这应该是开箱即用的,并且会认为它是一个错误。
使这项工作的一个选择是简单地改变构建事物的顺序。默认情况下,setup.py
将首先收集python模块,然后构建任何外部包。
您可以通过对默认build
类进行子类化来更改构建顺序,然后让setup.py
通过build
选项使用您的自定义cmdclass
类。< / p>
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']
)],
...