【问题标题】:Using distutils where swig interface file is in src folder使用 swig 接口文件位于 src 文件夹中的 distutils
【发布时间】:2013-07-16 00:17:16
【问题描述】:

我有一个如下所示的 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。有没有办法让这一切都在第一次工作?

【问题讨论】:

  • 我的设置比你的更简单,但我发现我必须这样做。一种“解决方法”是先运行构建,然后安装,但所做的只是生成 swig 包装器,以便安装看到它。它在安装阶段而不是构建阶段被复制。

标签: python swig distutils


【解决方案1】:

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

让这个工作的一个选择是简单地改变构建的顺序。默认情况下,setup.py 将首先收集 python 模块,然后构建任何外部包。

您可以通过子类化默认的build 类来更改构建顺序,然后通过cmdclass 选项让setup.py 使用您的自定义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']
                   )],
    ...

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多