我有一个看起来像这样的 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。有没有办法让这一切在第一次工作?

最佳答案

我确实同意这应该是开箱即用的,并且会认为它是一个错误。

实现此功能的一种选择是简单地更改构建的顺序。默认情况下,setup.py 将首先收集 python 模块,然后构建任何外部包。

您可以通过对默认 build 类进行子分类来更改构建顺序,然后通过 setup.py 选项让 build 使用您的自定义 cmdclass 类。

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']
                   )],
    ...

关于python - 使用 distutils,其中 swig 接口(interface)文件位于 src 文件夹中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17666018/

10-12 17:26
查看更多