如何运行python';sdist&x27;不使用子流程的python自动化脚本中的命令?

如何运行python';sdist&x27;不使用子流程的python自动化脚本中的命令?,python,subprocess,packaging,pip,distutils,Python,Subprocess,Packaging,Pip,Distutils,我正在编写一个脚本来自动打包“自制”python模块,并将其分发到远程机器上 我正在使用Pip并创建了一个setup.py文件,但随后必须调用子流程模块来调用“python setup.py sdist”命令 我已经看过distutils.core中的“run_setup”方法,但我试图避免同时使用子流程模块。(如果我已经在使用python,那么打开shell来运行python命令就没有意义了…) 有没有办法将distutils模块导入到我的脚本中,并将设置信息直接传递给其中一个方法,从而避免完

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

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

我已经看过distutils.core中的“run_setup”方法,但我试图避免同时使用子流程模块。(如果我已经在使用python,那么打开shell来运行python命令就没有意义了…)

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


谢谢

如果您没有真正的理由避免使用子流程(即缺乏平台支持,而不仅仅是美观(“我看不出有什么意义”),那么我建议您不应该关心子流程,而应该在子流程中运行。有几种方法可以满足您的要求,但它们也有其缺点(比如必须捕获异常和报告错误)。

为了完整起见,我想回答这个问题,因为我自己也在尝试找到解决方法。在我的例子中,我希望确保使用相同的python版本来执行该命令,这就是为什么使用subprocess不是一个好的选择。(编辑:正如在评论中指出的,我可以将sys.executable与subprocess一起使用,尽管编程执行在我看来仍然是一种更干净的方法——而且显然非常简单。)

(使用不调用子流程,但在受控范围/环境中使用exec。)

另一种选择可能是使用setuptools命令,尽管我还没有对此进行完整的探讨。显然,您仍然需要找出如何避免重复项目元数据

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

不管怎样,希望这能帮助某人朝着正确的方向前进。毕竟,有很多正当的理由希望以编程方式执行打包操作

无论如何,如果您能概述这些方法是什么,并允许我权衡利弊,做出明智的决定,我非常希望。您可以使用完全相同的版本,使用
sys.executable
subprocess
。谢谢,这对未来很有用;尽管在本例中,从我的构建框架上下文运行命令仍然很方便。无论如何,以编程方式运行比使用子流程更简单,产生的错误也更丰富。隔离性更差。如果在同一进程中运行多个
setup.py
,可能会得到不正确的结果。在
setup.py
中修补
setuptools
distutils
,可能会干扰其他脚本的情况并不少见
pip
使用
subprocess
运行
setup.py
文件。可能是抽象的,但问题是如何在没有子流程的情况下执行此操作,这显然是完全可能的,并且有许多场景是有意义的。您可以提供一种在没有
subprocess
的情况下运行它的方法,但您不应该说这是一种错误“清洁”方法。相关:
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