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

Posted

技术标签:

【中文标题】如何在不使用子进程的情况下从 python 自动化脚本中运行 python \'sdist\' 命令?【英文标题】:How do i run the python 'sdist' command from within a python automated script without using subprocess?如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令? 【发布时间】:2012-04-11 22:34:57 【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

相关:Run a python script from another python script, passing in args 【参考方案1】:

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

【讨论】:

无论如何,如果您能概述这些方法是什么,并允许我通过权衡利弊做出明智的决定,我非常希望。【参考方案2】:

为了完整起见,我想回答这个问题,因为我遇到它试图自己找出如何做到这一点。就我而言,我想确保使用 same python 版本来执行命令,这就是为什么使用 subprocess 不是一个好的选择。 (编辑:正如评论中所指出的,我可以将 sys.executable 与子进程一起使用,尽管 IMO 仍然是一种更简洁的方法——而且显然非常简单。)

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

from distutils.core import run_setup

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

另一种选择,可能是使用 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.executablesubprocess 使用完全相同的版本。 谢谢,这对未来很有用;尽管在这种情况下,从我的构建框架上下文中运行命令仍然很方便。无论如何,以编程方式运行是微不足道的,并且会产生比使用子进程更丰富的错误。 隔离更差。如果您在同一进程中运行多个setup.py,您可能会得到不正确的结果。在setup.py 中打补丁setuptoolsdistutils 并不少见,这可能会干扰其他脚本。 pip 使用 subprocess 运行 setup.py 文件。 也许是抽象的,但问题是如何在没有子流程的情况下执行此操作,这显然是完全可能的,并且有很多情况下这是有意义的。 您可以提供一种无需subprocess 的方式来运行它,但您不应该说这是一种“更清洁”的方式。

以上是关于如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不提供 C# 管理员凭据的情况下从标准用户启动进程

如何在不回显的情况下从 shell 脚本中获取密码

如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?

如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?

如何在不使用 pip install 的情况下从 tar.gz 文件安装 Python 包

如何在不使用 ImageView 的情况下从 API 端点下载图像或位图?