一些上下文:我有一些 C 代码,编译后我可以像这样在终端中调用:./my_excec -params
它生成一些文件,我在 python 中使用这些文件来生成图表,并且其他东西。
我想将 C 代码和 Python 代码都打包到 Python 库中。 C 代码不是 python 扩展(将来可能会是,但现在不是)。
我有一个 make 文件来编译 C 代码,我知道我可以从 setup.py 中调用它,如下所示:
subprocess.call(['make', '-C', 'word2vec-src'])
我希望能够做的是:pip install my_module
这应该调用 makefile,编译 C,以便用户可以调用二进制文件:my_excec -params
并且还能够围绕它导入 python 代码。
我遇到的问题是打包 python 包时。我在 setup()
中使用 data_files
选项,如下所示:data_files=[('bin', ['bin/binary_file'])],
这会将文件从 bin 移动到安装文件夹(在虚拟环境中),我可以调用它们。但是当打包时也将编译后的文件放入 tarball 中,当我调用 pip install my_module` 时将编译后的文件从我的计算机中放入。
谢谢。
最佳答案
我找到了一个非常简单的解决方案。
正如我所说,我的主要问题是我正在打包编译后的文件。要从 tarball/zip 中排除这些文件,只需将其放在 MANIFEST.in 中:prune bin
。
然后只需要从 setup.py 中调用 makefile:
directory = 'bin'
if not os.path.exists(directory):
os.makedirs(directory)
subprocess.call(['make', '-C', 'src'])
当有人执行 pip install whatever
时,将调用 make 文件并将二进制文件放入 bin
(必须在 make 文件中指定)。
然后只需要说出复制那些文件的设置:
setup(
...
data_files=[('bin', ['bin/binaries'])],
)
完成!希望有人觉得这很有用 :)
关于Python setup.py 调用 makefile 不包含二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18436061/