我应该使用pip.main()还是subprocess.call()来调用pip命令?

问题描述 投票:9回答:5

我正在编写一个需要使用pip安装依赖项的程序。什么是正确的方法,为什么?

理想情况下,它必须与平台无关,但是该程序将在Linux机器上运行。

方法1:pip.main()

import pip
args = ['param1', 'param2']
version = 0.1
package = ['some_package=={}'.format(version)]
pip.main(['install'] + args + package) 

方法2:subprocess.call()

import subprocess
import sys
version = 0.1
package = 'some_package'

subprocess.call([sys.executable, '-m', 'pip', 'install', '{}=={}'.format(package, version)])
python pip subprocess
5个回答
9
投票

一般

除非您要授予其他人对该进程的所有权,否则请不要称其为main()。例如,他们可以调用sys.exit()os.exec*()函数之一。他们还可以安装信号处理程序,更改umask或对进程状态进行各种其他全局更改。如果您不希望他们这样做,则应该在子进程中运行他们的代码。

((当然,库代码可以轻松地完成上述所有操作,但是在没有进行文档说明的情况下,这样做是不礼貌的,而main()函数的作者通常假定他们自己掌握了整个过程。 )

特别是点子

pip.main() is not a public interface,并且不受支持。使用子过程。


1
投票

取决于。 pip.main()未记录,并且可能不向后兼容。我建议改用pip,因为pip的基本语义不太可能在不久的将来更改。


1
投票

[看着subprocessPEP 338,看来pip python source等效于python -m pip [args]。因此,任何一个选项都应该可以正常工作。

我宁愿直接调用import sys, pip; sys.exit(pip.main(*args)),因为它的复杂程度要低一个。

也就是说,main()不是公共接口,因此在将来的发行版中可能会更改。因此,可以使用子流程调用。


0
投票

pip.main()开始,pip.main()不被支持/公开,因此,您可以使用替代方法]

10.0

0
投票

我希望还不晚... :)这就是我在软件包安装过程中使用带有多个选项的子进程和pip的方式。这些选项也可以存储在pip.ini文件中。

def install_module(mod):
    from pip import _internal as pip
    pip.main(['install', mod])
© www.soinside.com 2019 - 2024. All rights reserved.