Ben*_*Ben 6 python packaging subprocess distutils pip
我正在编写一个脚本来自动打包“自制”python 模块并将其分发到远程机器上。
我正在使用 Pip 并创建了一个 setup.py 文件,但是我必须调用子进程模块来调用“python setup.py sdist”命令。
我已经查看了 distutils.core 中的“run_setup”方法,但我试图避免全部使用 subprocess 模块。(如果我已经在 python 中,我认为打开 shell 来运行 python 命令没有意义......)
有没有办法将 distutils 模块导入我的脚本并将设置信息直接传递给其方法之一并完全避免使用 shell 命令?或任何其他可能对我有帮助的建议
谢谢
为了完整起见,我想回答这个问题,因为我遇到了它,试图找出自己如何做到这一点。就我而言,我想确保使用相同的python 版本来执行命令,这就是为什么使用 subprocess 不是一个好的选择。(编辑:正如评论中所指出的,我可以将 sys.executable 与子进程一起使用,尽管程序执行仍然是 IMO 的一种更清晰的方法——而且显然非常简单。)
(使用distutils.core.run_setup不会调用子进程,而是在受控范围/环境中使用 exec。)
from distutils.core import run_setup
run_setup('setup.py', script_args=['sdist'])
Run Code Online (Sandbox Code Playgroud)
另一种选择可能是使用 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
Run Code Online (Sandbox Code Playgroud)
无论如何,希望这会帮助某人朝着正确的方向前进。毕竟,有很多正当理由想要以编程方式执行打包操作。
如果您没有\xe2\x80\x99t有真正的理由避免子进程(即缺乏平台支持,而不仅仅是美观(\xe2\x80\x9c我看不出有什么意义\xe2\x80\x9d)),那么我建议你应该只是不关心并在子进程中运行。有几种方法可以实现您的要求,但它们都有其缺点(例如必须捕获异常和报告错误)。
\n| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |