Python setup.py调用makefile不包含二进制文件

时间:2013-08-26 03:10:25

标签: python c setup.py

某些上下文:我有一些C代码,在编译时我可以在终端中调用:./my_excec -params它生成一些我在python中使用的文件来生成图表和其他东西。

我想在python库中打包C代码和python代码。 C代码不是python扩展(将来会很多,但现在不是)。

我有一个make文件来编译C代码,我知道我可以从setup.py中调用它,如下所示: subprocess.call(['make', '-C', 'word2vec-src'])

我希望能够做的是:pip install my_module这应该调用makefile,编译C以便用户可以调用二进制文件:my_excec -params并且还能够导入python代码它

我遇到的问题是打包python包时。我正在使用data_files中的setup()选项,如下所示:data_files=[('bin', ['bin/binary_file'])],这会将文件从bin移动到安装文件夹(在虚拟环境中),我可以调用它们。但是当打包时也将编译好的文件放在tarball中,当我调用pip install时,my_module`将把编译过的文件放在我的计算机上。

感谢。

1 个答案:

答案 0 :(得分:4)

我能够找到一个非常简单的解决方案。

正如我所说,我的主要问题是我正在打包已编译的文件。要从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'])],
)

完成!希望有人发现这个有用:)