我正在编写一个需要使用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)])
除非您要授予其他人对该进程的所有权,否则请不要称其为main()
。例如,他们可以调用sys.exit()
或os.exec*()
函数之一。他们还可以安装信号处理程序,更改umask或对进程状态进行各种其他全局更改。如果您不希望他们这样做,则应该在子进程中运行他们的代码。
((当然,库代码可以轻松地完成上述所有操作,但是在没有进行文档说明的情况下,这样做是不礼貌的,而main()
函数的作者通常假定他们自己掌握了整个过程。 )
pip.main()
is not a public interface,并且不受支持。使用子过程。
取决于。 pip.main()
未记录,并且可能不向后兼容。我建议改用pip
,因为pip的基本语义不太可能在不久的将来更改。
[看着subprocess
和PEP 338,看来pip python source等效于python -m pip [args]
。因此,任何一个选项都应该可以正常工作。
我宁愿直接调用import sys, pip; sys.exit(pip.main(*args))
,因为它的复杂程度要低一个。
也就是说,main()
不是公共接口,因此在将来的发行版中可能会更改。因此,可以使用子流程调用。
自pip.main()
开始,pip.main()不被支持/公开,因此,您可以使用替代方法]
10.0
我希望还不晚... :)这就是我在软件包安装过程中使用带有多个选项的子进程和pip的方式。这些选项也可以存储在pip.ini文件中。
def install_module(mod):
from pip import _internal as pip
pip.main(['install', mod])