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

时间:2017-11-01 16:34:17

标签: python pip subprocess

我正在编写一个需要使用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)])

5 个答案:

答案 0 :(得分:8)

一般

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

(当然,库代码可以很容易地完成上述所有操作,但是如果没有记录它就会被认为是“粗鲁”,而main()函数的作者通常认为它们具有整个过程对自己。)

特别是Pip

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

答案 1 :(得分:1)

这取决于。 $options=array( 'width'=>550 ); $pdf->ezTable($data,$cols='',$title='',$options); 未记录,可能无法向后兼容。我建议使用pip代替,因为pip的基本语义在不久的将来不太可能改变。

答案 2 :(得分:0)

查看PEP 338pip python source,似乎python -m pip [args]等同于import sys, pip; sys.exit(pip.main(*args))。因此,任何一个选项都应该没有问题。

我更喜欢直接致电main(),因为它的复杂程度较低。

尽管如此,pip.main()不是公共接口,因此在将来的版本中可能会发生变化。因此,这将争论使用子进程调用。

答案 3 :(得分:0)

10.0起不支持/暴露pip.main(), 所以你可以使用

作为一种解决方法
def install_module(mod):
    from pip import _internal as pip
    pip.main(['install', mod])

答案 4 :(得分:0)

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

import subprocess

pkg =<package to install>
subprocess.call([sys.executable,'-m', 'pip', 'install','--trusted-host=pypi.org', '--trusted-host=files.pythonhosted.org', pkg])