【发布时间】:2012-10-07 21:37:06
【问题描述】:
如何在 python 脚本中使用 pip 安装软件包? 我不使用os.system,我想导入pip并使用它。
【问题讨论】:
如何在 python 脚本中使用 pip 安装软件包? 我不使用os.system,我想导入pip并使用它。
【问题讨论】:
在 python 脚本中安装包不是一个好主意,因为它需要 root 权限。您应该随您创建的脚本一起提供其他模块或检查模块是否已安装:
try:
import ModuleName
except ImportError:
print 'Error, Module ModuleName is required'
如果您坚持在脚本中使用 pip 安装软件包,则必须查看 subprocess 模块中的 call(不推荐使用“os.system()”)。
没有 pip 模块,但您可以使用上述方法轻松创建一个。
【讨论】:
subprocess使用pip是推荐的方法pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
这是对this post 的评论,不适合分配给 cmets 的空间。
请注意,安装软件包的用例可能出现在 setup.py 本身内部。例如,生成ply 解析器表并将它们存储到磁盘。这些表必须在setuptools.setup 运行之前生成,因为它们必须与正在安装的包一起复制到site_packages。
确实存在setuptools.setup 的setup_requires option,但是不安装包。
因此,安装过程所需的依赖项和已安装包的将不会以这种方式安装。
在install_requires 中放置这样的依赖项确实是not always work as expected。
即使它有效,也必须将一些函数传递给setuptools.setup,以便在setup_requires 中安装依赖项和安装包本身之间运行。这种方法是嵌套的,因此反对PEP 20。
所以剩下的两种扁平化方法是:
运行setup.py 两次,自动(首选)或手动(通过通知用户在setuptools.setup 之前无法构建表。
首先调用pip(或其他等效解决方案),以安装所需的依赖项。然后继续构建表(或任何必要的预安装任务),最后致电setuptools.setup。
就我个人而言,我更喜欢 No.2,因为 No.1 可能会让在安装过程中观察控制台输出的用户感到困惑,除非他们已经知道两次调用 setuptools.setup 的意图。
此外,在运行setup.py 时(并且恰好在那时),安装所需的任何权限(例如,根,如果需要)肯定存在。因此,setup.py 可以被视为此类操作的“规范”用例。
【讨论】:
我认为这些答案已经过时了。事实上你可以这样做:
import pip
failed = pip.main(["install", nameOfPackage])
并在传递给 main() 的列表中插入任何其他参数。它返回 0(失败)或 1(成功)
乔恩
【讨论】:
如果您使用代理,您可以在代码中安装模块,如下所示...
import pip
pip.main(['install', '--proxy=user:password@proxy:port', 'packagename'])
【讨论】:
我使用 os.system 来模拟终端安装 pip 模块,(我知道 os.system 已被弃用,但它仍然有效,这也是最简单的方法),例如我正在制作游戏引擎它有多个使用 Pygame 的 python 脚本,在启动文件中,如果他们没有,我使用此代码将 pygame 安装到用户的系统上:
import os
os.system('pip install pygame')
不幸的是,如果他们没有 pip,我不知道如何安装它,所以这个脚本依赖于 pip。
【讨论】:
ensurepip 模块,该模块适用于所有较新的python 版本:import ensurepip; ensurepip.bootstrap()
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
【讨论】:
flit)。这是因为 pip 会将os.environ['PIP_REQ_TRACKER'] 设置为一个临时目录名,之后会被删除,但不会清除环境。因此最好使用os.system 或任何其他可用方法在子进程中调用 pip。