我遇到了一个问题,我试图在虚拟环境中运行Django应用程序,但它一直显示需要安装的缺少包的错误,尽管我以前使用pip install <package-name>安装了它们。
这些问题在我使用python -m pip install <package-name>安装丢失的软件包之前是无法解决的。
我的问题是,这两个命令有什么区别?其中一个命令是否将包安装到虚拟环境,而另一个命令是全局安装包?我很困惑。
边注:在运行pip freeze时,还会显示与运行python -m pip freeze时不同的安装包。
更新1:
运行pip list -v显示使用pip install <package-name>安装的包位于lib/python3.8/site-packages目录下的虚拟环境文件夹中,而运行python -m pip list -v则显示使用python -m pip <package-name>安装的包位于/usr/lib/<python3 or python3.8>/<site-packages or dist-packages>目录下。
更新第2号:
我使用运行Ubuntu20.0464位的VPS完成了上述所有操作。奇怪的是,当我在运行Linux的本地机器上执行两个命令时,本地机器上的pip install <package-name>和python -m pip install <package-name>没有什么区别。
更新3:
我所做的就是删除了我的虚拟环境,并创建了一个具有相同名称和相同目录的新环境。为了使事情更清楚,下面的屏幕截图展示了我面临的问题:
1-下面的屏幕截图显示了在全局运行pip list -v时的结果:

2-下面的屏幕截图显示了在全局运行python -m pip list -v时的结果:

上面的两个屏幕截图显示了相同的结果(这两个命令都是全局执行的,没有活动的虚拟环境)。
3-下面的屏幕截图显示了在虚拟环境中运行pip list -v的结果:

4.下面的屏幕截图显示了在虚拟环境中运行python -m pip list -v的结果:

上面的2个屏幕截图显示了不同的结果(这两个命令都是在激活虚拟环境时执行的)。
尽管我创建了一个新的虚拟环境,但问题仍然存在。
发布于 2021-10-27 09:14:57
欢迎来到PATH__和shebang #!/... (*nix)的符号链接、二进制可发现性世界。
在讨论这一切之前,让我们先谈谈pip是什么:
pip既是一个python模块(即python -m pip ( -m均值模块)),也是一个二进制$ pip。pip作为二进制文件(程序)是可选的,它不是必需的。pip作为模块(在site-packages中安装了所有python模块)是绝对必要的!如果没有它,任何东西都不能工作,或者更糟的是,您将使用来自您已安装的另一个python版本的pip模块,然后您将真正地将头撞到墙上.
路径变量
echo $PATH (*nix)将向您展示如下内容:
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin这意味着系统,通过终端将首先在/usr/local/bin内部查找二进制文件,然后是/usr/bin,然后.等等。如果它一开始就找到了,它看起来,很好,它已经完成了,不需要继续搜索。您可以在不同的目录中使用相同的二进制名称,重要的是PATH的顺序,第二个二进制名称永远不会被执行。
我为什么要提这个?那么,假设您安装了多个版本的python或pip,而您在错误的位置安装了它?订单哪里出错了?这个二进制文件不会像预期的那样运行。
符号链接
您可以有不同版本的pip和python --它们是相互独立的,这意味着仅仅因为您使用的是版本3.8的python,并不意味着您的pip指向相同的python二进制文件。
检查的一个快速方法是这样做:(这适用于pip)
$ ls -ls $(which python)
0 lrwxr-xr-x 1 root wheel 75 Jan 1 2020 /usr/bin/python -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7您可以看到它使用的是python的系统版本,如果我只运行python,我可以通过指定版本号(如python3.8)来“修复”这个问题。
您可以通过先找出您可以使用的二进制文件来修复这个二进制文件:
$ echo $PATH | sed 's/:/ /g' | xargs -n1 -I{} find {} -name 'python*' | grep -v 'config$'
/usr/local/bin/python3
/usr/local/bin/python3.9
/usr/local/bin/python3.8
/usr/bin/python3
/usr/bin/python
/usr/bin/python2
/usr/bin/pythonw
/usr/bin/pythonw2.7
/usr/bin/python2.7假设我希望我的默认python是python3.8,那么请执行:
$ ln -s /usr/local/bin/python3.8 /usr/local/bin/python
$ hash -rhash -r告诉终端忘记它以前发现的所有横幅,否则你的新符号链接就行不通了。
问:为什么不直接推翻它呢?
您可能会问,如果默认的python在/usr/bin/python中,为什么不直接使用它来覆盖呢?
$ ln -sf /usr/local/bin/python3.8 /usr/bin/python/usr/bin/是受保护的,与系统偏好混为一谈是不好的形式。最好不要碰它,/usr/local/bin是你的(机器的用户)乱搞的。
雪邦#!/...
在大多数情况下,您会发现pip二进制文件(顺便说一句,这只是纯文本)是这样开始的:
#!/usr/bin/env python或
#!/usr/local/bin/python3.9这说明,我是一个文本文件,需要使用以下可执行文件运行。在第一个示例中,它使用系统对二进制python进行格式化,就像在终端中找到二进制PATH一样,参见上面的PATH变量。第二个示例是系统要使用的二进制文件的直接路径。
请记住,pip是一个模块,二进制pip字面上是这样说的:(这是轻率地修改,使它尽可能基本,并说明一点)
#!/usr/bin/env python
import sys
from pip._internal.cli.main import main
sys.exit(main())binary
python python sys模块从pip模块
main返回main函数,它返回给< code >D59的代码通常会返回0,但这与此无关。只是一辆FYI发布于 2021-10-27 08:53:14
通常情况下没有区别。
python -m标志允许您运行特定的模块。例如,您可以运行python -m http.server来启动当前目录中的简单服务器。
Python包含一个“脚本”目录。根据系统设置的不同,scripts目录中的模块可以直接从shell运行,而无需python -m前缀。例如,通常直接从shell运行black。
但是,您可能不希望信任直接从shell运行python模块的各种原因,包括:
运行特定python版本的
py -3.6 -m pip install something来指定python版本的在虚拟环境中,这两个命令通常会执行相同的操作,因为virtualenv将正确地设置路径。
发布于 2021-10-27 10:34:27
当您需要定义需要安装包的python版本时,它非常方便(对不起,我的英语很差)。比方说,您有python3.8和python3.10。你可以做python3.8 -m pip install django和python3.10 -m pip install django
https://stackoverflow.com/questions/69734955
复制相似问题