想象一下,我们得到了一个名为MyAwesomeLib. 目标是将其部分功能暴露给 python,因此我们使用 swig 创建了一个包装器并生成了一个名为PyMyAwesomeLib.
目录结构现在看起来像
root_dir
|-src/
|-lib/
| |- libMyAwesomeLib.so
| |- _PyMyAwesomeLib.so
|-swig/
| |- PyMyAwesomeLib.py
|-python/
|- Script_using_myawesomelib.py
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。理想情况下,所有我们下一步要做的就是复制lib/*.so swig/*.py并python/*.py在进入相应的目录site-packages在Python化,即使用方式
python setup.py install
Run Code Online (Sandbox Code Playgroud)
但是,在尝试使用setuptoolsand实现这个简单的目标时,我感到非常困惑distutils。这两个工具都通过内部系统处理 python 扩展的编译,其中源文件、编译器标志等使用setup(ext_module=[Extension(...)]). 但这很荒谬,因为它MyAsesomeLib有一个基于 makefile 的功能齐全的构建系统。移植嵌入在 makefile 中的逻辑将是多余的并且完全没有必要的工作。
经过一些研究,似乎还有两个选项,我可以覆盖setuptools.command.build并setuptools.command.install使用现有的 makefile 并直接复制结果,或者我可以以某种方式setuptools告知这些文件并要求它在安装过程中复制它们。第二种方式更吸引人,但却是最让我头疼的地方。我尝试了以下选项但没有成功
package_data, 并且include_package_data不起作用,因为 *.so 文件不受版本控制并且它们不在任何包内。data_files似乎不起作用,因为文件只在运行时被包含python setup.py sdist,但在python setup.py install …