如何在不使用子进程的情况下从 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.executable
和subprocess
使用完全相同的版本。
谢谢,这对未来很有用;尽管在这种情况下,从我的构建框架上下文中运行命令仍然很方便。无论如何,以编程方式运行是微不足道的,并且会产生比使用子进程更丰富的错误。
隔离更差。如果您在同一进程中运行多个setup.py
,您可能会得到不正确的结果。在setup.py
中打补丁setuptools
、distutils
并不少见,这可能会干扰其他脚本。 pip
使用 subprocess
运行 setup.py
文件。
也许是抽象的,但问题是如何在没有子流程的情况下执行此操作,这显然是完全可能的,并且有很多情况下这是有意义的。
您可以提供一种无需subprocess
的方式来运行它,但您不应该说这是一种“更清洁”的方式。以上是关于如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?
如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?