我正在编写一个需要使用pip安装依赖项的程序。这样做的正确方法是什么?为什么?
理想情况下,它需要与平台无关,但该程序将在Linux机器上运行。
pip.main()
import pip
args = ['param1', 'param2']
version = 0.1
package = ['some_package=={}'.format(version)]
pip.main(['install'] + args + package)
subprocess.call()
import subprocess
import sys
version = 0.1
package = 'some_package'
subprocess.call([sys.executable, '-m', 'pip', 'install', '{}=={}'.format(package, version)])
答案 0 :(得分:8)
除非您想让他们拥有该流程,否则请不要打电话给其他人main()
。例如,他们可以调用sys.exit()
或其中一个os.exec*()
函数。他们还可以安装信号处理程序,更改umask,或对进程的状态进行各种其他全局更改。如果你不希望他们这样做,你应该在子进程中运行他们的代码。
(当然,库代码可以很容易地完成上述所有操作,但是如果没有记录它就会被认为是“粗鲁”,而main()
函数的作者通常认为它们具有整个过程对自己。)
pip.main()
is not a public interface,不受支持。使用子流程。
答案 1 :(得分:1)
这取决于。 $options=array(
'width'=>550
);
$pdf->ezTable($data,$cols='',$title='',$options);
未记录,可能无法向后兼容。我建议使用pip
代替,因为pip的基本语义在不久的将来不太可能改变。
答案 2 :(得分:0)
查看PEP 338和pip 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])