在python空闲时运行pip

Hyu*_*Kim 8 python pip python-idle

我对运行pip感到好奇.每次我在这样的窗口中运行命令shell中的pip

c:\python27\script>pip install numpy
Run Code Online (Sandbox Code Playgroud)

但是,我想知道我是否可以在python空闲时运行它.

import pip
pip.install("numpy")
Run Code Online (Sandbox Code Playgroud)

不幸的是,它没有用.

rtr*_*rtr 6

仍然无法发表评论,所以我添加了另一个答案。Pip 过去有几个入口点。并且不建议直接或在进程内调用 pip(如果您仍然想这样做,建议使用“runpy” ):

import sys
import runpy

sys.argv=["pip", "install", "packagename"]
runpy.run_module("pip", run_name="__main__")
Run Code Online (Sandbox Code Playgroud)

但这也应该有效:

try:
    from pip._internal import main as _pip_main
except ImportError:
    from pip import main as _pip_main
_pip_main(["install", "packagename"])
Run Code Online (Sandbox Code Playgroud)


fn.*_*fn. 5

目前没有官方方法可以做到这一点,您可以使用 pip.main 但您当前的空闲会话将不会“看到”此已安装的软件包。

关于如何为 pip 添加“高级”编程 API进行了很多讨论,这似乎很有希望。


Ter*_*edy 5

这个问题是或者应该是关于如何从 python 程序运行 pip。IDLE 与此版本的问题没有直接关系。

扩展 JJ Hakala 的评论:诸如pip install pillow在空格上拆分的命令行变为sys.argv. 当 pip 作为主模块运行时,它会调用pip.main(sys.argv[1:]). 如果一个进口点子,一个可以调用pip.main(arg_line.split()),这里arg_line是后命令行的一部分pip

去年九月(2015 年),我尝试从另一个 python 程序中使用这个意外的 API,并报告了跟踪器问题23551的初步结果。讨论和进一步的结果随之而来。

在一个进程中执行多个命令的问题在于,一些 pip 命令不仅缓存了通常保持不变的 sys.path,而且缓存了通常会更改的已安装包列表。由于 pip 旨在为每个进程运行一个命令,然后退出,因此它永远不会更新缓存。当 pip.main 用于在一个进程中运行多个命令时,缓存后给出的命令可能会使用陈旧且不再正确的缓存。例如,listafterinstall显示了 install 之前的情况

想要检查 pip 输出的程序的第二个问题是它转到 stdout 和 stderr。我发布了一个程序,将这些流捕获到程序变量中,作为运行 pip 的一部分。

正如 L_Pav 所建议的那样,对每个 pip 命令使用子进程调用,虽然效率较低,但可以解决这两个问题。该communicate方法使输出流可用。请参阅子流程文档。