如何在不使用子进程的情况下从python自动脚本中运行python'sdist'命令?

时间:2012-03-28 10:36:41

标签: python subprocess packaging pip distutils

我正在编写一个脚本来自动打包“自制”python模块并将其分发到远程计算机上。

我正在使用Pip并创建了一个setup.py文件但我必须调用子进程模块来调用“python setup.py sdist”命令。

我已经查看了distutils.core中的“run_setup”方法,但我试图避免全部使用子进程模块。 (如果我已经在python中,我认为打开shell运行python命令没有意义......)

有没有办法将distutils模块导入我的脚本并将设置信息直接传递给它的一个方法,并避免完全使用shell命令?或任何其他可能对我有帮助的建议

感谢

2 个答案:

答案 0 :(得分:2)

为了完整起见,我想回答这个问题,因为我发现它试图找出自己如何做到这一点。在我的例子中,我想确保使用相同的 python版本来执行命令,这就是使用子进程不是一个好选择的原因。 (编辑:正如评论中指出的那样,我可以在子进程中使用sys.executable,虽然程序执行仍然是IMO仍然是一个更清晰的认可 - 显然非常简单。)

(使用distutils.core.run_setup不会调用子进程,但在受控范围/环境中使用exec。)

from distutils.core import run_setup

run_setup('setup.py', script_args=['sdist'])

另一种选择,可能是使用setuptools命令,但我还没有探究完成。显然,你仍然需要弄清楚如何避免重复你的proj元数据。

from setuptools.dist import Distribution
from setuptools.command.sdist import sdist

dist = Distribution({'name': 'my-project', 'version': '1.0.0'}) # etc.
dist.script_name = 'setup.py'
cmd = sdist(dist)
cmd.ensure_finalized()
cmd.run()  # TODO: error handling

无论如何,希望这将有助于某些人朝着正确的方向前进。毕竟,有很多有效的理由要以编程方式执行打包操作。

答案 1 :(得分:0)

如果你没有真正的理由避免子进程(即缺乏平台支持,而不仅仅是美学(“我看不出来”)),那么我建议你不应该关心并在子进程中运行。有几种方法可以实现您的要求,但它们有缺点(比如必须捕获异常并报告错误)。