20

如何在 python 脚本中使用 pip 安装包?我不使用 os.system,我想导入 pip 并使用它。

4

6 回答 6

28

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
于 2018-08-06T09:37:07.447 回答
8

我认为这些答案已经过时了。事实上你可以这样做:

import pip
failed = pip.main(["install", nameOfPackage])

并在传递给 main() 的列表中插入任何其他参数。它返回 0(失败)或 1(成功)

乔恩

于 2016-05-23T11:33:44.553 回答
5

在 python 脚本中安装包不是一个好主意,因为它需要 root 权限。您应该与您创建的脚本一起提供其他模块或检查模块是否已安装:

try:
   import ModuleName
except ImportError:
   print 'Error, Module ModuleName is required'

如果您坚持在脚本中使用 pip 安装软件包,则必须callsubprocess模块中查看(os.system()不推荐使用“”)。

没有 pip 模块,但您可以使用上述方法轻松创建一个。

于 2012-10-17T15:21:49.603 回答
3

我使用 os.system 来模拟安装 pip 模块的终端,(我知道 os.system 已被弃用,但它仍然有效,这也是最简单的方法),例如我正在制作一个具有多个的游戏引擎所有使用 Pygame 的 python 脚本,在启动文件中,如果他们没有,我使用此代码将 pygame 安装到用户的系统上:

import os
os.system('pip install pygame')

不幸的是,如果他们没有 pip,我不知道如何安装它,所以这个脚本依赖于 pip。

于 2018-02-14T10:05:05.587 回答
1

如果您在代理后面,则可以在代码中安装模块,如下所示...

import pip
pip.main(['install', '--proxy=user:password@proxy:port', 'packagename'])
于 2017-04-10T09:24:26.650 回答
-2

这是对该帖子的评论,不适合分配给评论的空间。

请注意,安装包的用例可能会出现在其内部setup.py。例如,生成ply解析器表并将它们存储到磁盘。这些表必须在运行之前 setuptools.setup生成,因为它们必须site_packages与正在安装的包一起复制到 。

确实存在 的setup_requires选项setuptools.setup但是它不会安装软件包。

因此,安装过程和已安装软件包所需的依赖项将不会以这种方式安装。

将这样的依赖项放在里面install_requires并不总是按预期工作。即使它有效,也必须将一些函数传递给setuptools.setup, 以便在安装依赖setup_requires项和安装包本身之间运行。这种方法是嵌套的,因此是针对PEP 20的。

所以剩下的两种扁平化方法是:

  1. 运行setup.py两次,自动(首选)或手动(通过通知用户在setuptools.setup.

  2. 首先调用pip(或其他等效解决方案),以安装所需的依赖项。然后继续构建表(或任何必要的预安装任务),setuptools.setup最后调用。

就个人而言,我更喜欢 No.2,因为 No.1 可能会让在安装过程中观察控制台输出的用户感到困惑,除非他们已经知道调用setuptools.setup两次的意图。

此外,安装所需的任何权限(例如,根,如果需要),在setup.py运行时肯定存在(并且恰好在那时)。因此setup.py可以被视为此类操作的“规范”用例。

于 2015-02-11T04:57:29.380 回答