如何在 python 脚本中使用 pip 安装包?我不使用 os.system,我想导入 pip 并使用它。
6 回答
pip.main() 不再适用于 pip 版本 10 及更高版本。你需要使用:
from pip._internal import main as pipmain
pipmain(['install', 'package-name'])
为了向后兼容,您可以使用:
try:
from pip import main as pipmain
except ImportError:
from pip._internal import main as pipmain
我认为这些答案已经过时了。事实上你可以这样做:
import pip
failed = pip.main(["install", nameOfPackage])
并在传递给 main() 的列表中插入任何其他参数。它返回 0(失败)或 1(成功)
乔恩
在 python 脚本中安装包不是一个好主意,因为它需要 root 权限。您应该与您创建的脚本一起提供其他模块或检查模块是否已安装:
try:
import ModuleName
except ImportError:
print 'Error, Module ModuleName is required'
如果您坚持在脚本中使用 pip 安装软件包,则必须call
从subprocess
模块中查看(os.system()
不推荐使用“”)。
没有 pip 模块,但您可以使用上述方法轻松创建一个。
我使用 os.system 来模拟安装 pip 模块的终端,(我知道 os.system 已被弃用,但它仍然有效,这也是最简单的方法),例如我正在制作一个具有多个的游戏引擎所有使用 Pygame 的 python 脚本,在启动文件中,如果他们没有,我使用此代码将 pygame 安装到用户的系统上:
import os
os.system('pip install pygame')
不幸的是,如果他们没有 pip,我不知道如何安装它,所以这个脚本依赖于 pip。
如果您在代理后面,则可以在代码中安装模块,如下所示...
import pip
pip.main(['install', '--proxy=user:password@proxy:port', 'packagename'])
这是对该帖子的评论,不适合分配给评论的空间。
请注意,安装包的用例可能会出现在其内部setup.py
。例如,生成ply
解析器表并将它们存储到磁盘。这些表必须在运行之前 setuptools.setup
生成,因为它们必须site_packages
与正在安装的包一起复制到 。
确实存在 的setup_requires
选项,setuptools.setup
但是它不会安装软件包。
因此,安装过程和已安装软件包所需的依赖项将不会以这种方式安装。
将这样的依赖项放在里面install_requires
并不总是按预期工作。即使它有效,也必须将一些函数传递给setuptools.setup
, 以便在安装依赖setup_requires
项和安装包本身之间运行。这种方法是嵌套的,因此是针对PEP 20的。
所以剩下的两种扁平化方法是:
运行
setup.py
两次,自动(首选)或手动(通过通知用户在setuptools.setup
.首先调用
pip
(或其他等效解决方案),以安装所需的依赖项。然后继续构建表(或任何必要的预安装任务),setuptools.setup
最后调用。
就个人而言,我更喜欢 No.2,因为 No.1 可能会让在安装过程中观察控制台输出的用户感到困惑,除非他们已经知道调用setuptools.setup
两次的意图。
此外,安装所需的任何权限(例如,根,如果需要),在setup.py
运行时肯定存在(并且恰好在那时)。因此setup.py
可以被视为此类操作的“规范”用例。