在 python 脚本中使用“pip install/uninstall”[重复]
Posted
技术标签:
【中文标题】在 python 脚本中使用“pip install/uninstall”[重复]【英文标题】:use "pip install/uninstall" inside a python script [duplicate] 【发布时间】:2012-10-07 21:37:06 【问题描述】:如何在 python 脚本中使用 pip 安装软件包? 我不使用os.system,我想导入pip并使用它。
【问题讨论】:
相关:Installing python module within code 相关:How can I install Python modules programmatically / through a Python script? 【参考方案1】:在 python 脚本中安装包不是一个好主意,因为它需要 root 权限。您应该随您创建的脚本一起提供其他模块或检查模块是否已安装:
try:
import ModuleName
except ImportError:
print 'Error, Module ModuleName is required'
如果您坚持在脚本中使用 pip 安装软件包,则必须查看 subprocess
模块中的 call
(不推荐使用“os.system()
”)。
没有 pip 模块,但您可以使用上述方法轻松创建一个。
【讨论】:
我想做一些类似的事情:import pip; pip.install('package_name') 如果在 virtualenv 中使用 pip 会怎样?如果没有 root 权限,它仍然是可能的,不是吗?? 过时的答案。查看其他答案。 通过subprocess
使用pip是推荐的方法pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program【参考方案2】:
这是对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
可以被视为此类操作的“规范”用例。
【讨论】:
PEP 518 已过时/需要构建系统。【参考方案3】:我认为这些答案已经过时了。事实上你可以这样做:
import pip
failed = pip.main(["install", nameOfPackage])
并在传递给 main() 的列表中插入任何其他参数。它返回 0(失败)或 1(成功)
乔恩
【讨论】:
现已弃用 这与赞赏相反。它没有被某些人欣赏,他们杀死了它【参考方案4】:如果您使用代理,您可以在代码中安装模块,如下所示...
import pip
pip.main(['install', '--proxy=user:password@proxy:port', 'packagename'])
【讨论】:
【参考方案5】:我使用 os.system 来模拟终端安装 pip 模块,(我知道 os.system 已被弃用,但它仍然有效,这也是最简单的方法),例如我正在制作游戏引擎它有多个使用 Pygame 的 python 脚本,在启动文件中,如果他们没有,我使用此代码将 pygame 安装到用户的系统上:
import os
os.system('pip install pygame')
不幸的是,如果他们没有 pip,我不知道如何安装它,所以这个脚本依赖于 pip。
【讨论】:
您可以使用ensurepip
模块,该模块适用于所有较新的python 版本:import ensurepip; ensurepip.bootstrap()
【参考方案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
【讨论】:
重要提示:如果您从脚本中多次调用 pip,或者如果您首先从脚本中像这样调用它,然后在其他任何地方调用它,这将中断方式(我个人使用flit
)。这是因为 pip 会将os.environ['PIP_REQ_TRACKER']
设置为一个临时目录名,之后会被删除,但不会清除环境。因此最好使用os.system
或任何其他可用方法在子进程中调用 pip。
这适用于 AWS Glue python shell 服务。
这是明确不支持的pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
命名“_internal”的确切原因是明确表明您不应该在这样的脚本中使用 pip。请参阅上面的@Samizdis 回复以获得适当的指导。以上是关于在 python 脚本中使用“pip install/uninstall”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 脚本文件中使用 shell 脚本中的变量?
在 QT Creator 中使用 C++ 调用 Python 脚本
无法在另一个 python 脚本中使用来自 python 函数的属性