import sys
from .runner import run
if __name__ == '__main__':
exit = run()
if exit:
sys.exit(exit)
runner.run函数看起来像这样:
def run():
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
## FIXME: this is kind of crude; if we could create a fake pip
## module, then exec into it and update pip.__path__ properly, we
## wouldn't have to update sys.path:
sys.path.insert(0, base)
import pip
return pip.main()
3条答案
按热度按时间hsvhsicv1#
他们做的事情完全一样。实际上,发布Python模块的文档是just updated,建议使用
python -m pip
而不是pip
可执行文件,因为这样更容易判断将使用哪个版本的Python来实际运行pip
。这里有一些更具体的“证据”,不仅仅是相信我的话和我链接的错误报告:)
如果你看一下
pip
可执行脚本,它就是这样做的:它调用
load_entry_point
,返回一个函数,然后执行该函数。它使用的入口点称为'console_scripts'
。如果你查看pip
的entry_points.txt文件(在我的Ubuntu机器上的/usr/lib/python2.7/dist-packages/pip-1. 5. 4. egg-info/entry_points. txt),你会看到:因此返回的入口点是
pip
模块中的main
函数。当您运行
python -m pip
时,您正在执行pip
包中的__main__.py
脚本。它看起来像这样:runner.run
函数看起来像这样:如您所见,它也只是调用
pip.main
函数。因此,这两个命令最终都调用了pip/__init__.py
中的同一个main
函数。brccelvz2#
2021年**
只有在使用PyCharm创建venv时才会发生这种情况。请检查Scripts/ www.example.com是否pip-script.py位于虚拟环境中
pip install
和python -m pip install
并不完全相同。或者欢迎回到版本化和依赖性的地狱:-(如果我想安装一个软件包,我习惯输入
pip(.exe) install <name>
。但我遇到麻烦,如果我试图安装软件包枕头。它每次都会中断并显示错误消息。今天我重试
python -m pip install
复制&粘贴从手册和它的工作。在我忽略它并输入pip之前....因为我以为是一样的。我开始深入研究pip,找到了这个问题/答案。过了一会儿,我发现pip.exe调用脚本<virtual-environment/Scripts> pip-script.py。
我用枕头包安装战斗机。
我有点惊讶,pip.exe仍然使用旧版本19.0.3的软件包,而不是新安装的版本21.0.1。
我手动将两个版本字符串更改为21.0.1。现在pip.exe可以正确安装Pillow了。
从现在开始我明白了为什么pip仍然抱怨我使用的是旧版本的pip。
我认为旧的v19 pip在检测支持的平台方面有问题,因此安装了源代码而不是二进制文件。
4xy9mtcn3#
每个Python安装都可能附带自己的Pip版本。(出于安全原因,某些安装可能会故意排除Pip:例如,当Python包含在Linux发行版中时,它通常会省略Pip,这样用户就不会无意中将有害的东西安装到操作系统所依赖的Python副本中。
从概念上讲,Pip由两部分组成:
pip
标准库模块,包含在pip.py
文件中;和一个pip
“wrapper”可执行文件。(在Windows上,这是作为一个实际的.exe文件实现的;在Mac和Linux上,它应该只是一个Python脚本,具有执行权限设置,并且没有.py
文件扩展名。) Package 器的目的是运行相应标准库模块中的“主”代码。在命令行中使用
pip
将查找并运行PATH环境变量中的第一个 Package 器可执行文件,然后运行相应的Python代码 ,以安装与该 Package 器相关的Python 。因此,它将为任何Python安装第三方库。在命令行中使用
python -m pip
将在PATH环境变量中找到并运行无论哪个Python,并指示它在其 * 标准库中找到pip
标准库模块 (不直接;它将搜索sys.path
,就像任何模块导入一样)并运行它“as a module”。因此,它将为PATH中找到的Python安装第三方库。在Windows上,在命令行中使用
py -m pip
将(除非系统配置错误)找到并运行py
可执行文件*,该文件安装在始终位于PATH上的Windows目录中。这反过来又会让use its own logic在系统上选择一个Python,运行 itspip
,然后像以前一样继续。根据系统的配置方式,这些命令可能不会全部选择相同的Python安装。
使用
python -m pip
可以确保为 * 使用python myscript.py
* 运行的相同Python安装库。这对于那些正在编写myscript.py
的人来说非常有用,他们需要这些代码来使用将要安装的库,并希望它与任何python
一起运行。对于Windows,需要特别说明的是,
pip install --upgrade pip
将无法工作。This is because升级Pip涉及替换磁盘上的Pip Package 器可执行文件;通过以这种方式运行该命令, Package 可执行文件 * 就是正在运行的程序 *,并且Windows不允许程序在磁盘上替换自己。通过使用python -m pip install --upgrade pip
或py -m pip install --upgrade pip
,避免了这个问题,因为现在 Package 器可执行文件不运行- Python(可能还有py
)运行,使用来自pip.py
(或缓存的pip.pyc
)文件的代码。