为什么 python3 pip 模块找到 python2 库?

Why python3 pip module found the python2 libraries?

我正在尝试一个简单的片段,通过以下脚本升级我所有 pip 安装的包:

# pip_upgrade.py
import pip
from subprocess import call
black_list = ['scipy', 'PySide', 'python-apt']
failed_list = []
for dist in pip.get_installed_distributions():
    dist_name = dist.project_name
    if dist_name in black_list:
        continue
    rc = call(("pip install --upgrade " + dist.project_name).split(), shell=False) 
    if rc != 0:
        failed_list.append(dist_name)
print('=' * 80)
print('\n'.join(failed_list))

我希望这对 python2 和 python3 都有效,也就是说:

sudo python2 pip_upgrade.py
sudo python3 pip_upgrade.py

但是,我发现在尝试 python3(python3.4 时,输出如下所示:

Requirement already up-to-date: Send2Trash in /usr/local/lib/python2.7/dist-packages
Cleaning up...
Requirement already up-to-date: certifi in /usr/local/lib/python2.7/dist-packages
Cleaning up...

...

Requirement already up-to-date: wheel in /usr/lib/python2.7/dist-packages
Cleaning up... 

...

这表明 python3 版本仍然尝试列出 python2 库。

我还取消了 PYTHONPATH 的设置,列表 sys.path 在使用 python3 时不包含任何关于 python2 的内容,但仍然是同样的问题。

那我哪里错了?

你来电

rc = call(("pip install --upgrade " + dist.project_name).split(), shell=False) 

是一个系统调用,运行是您系统上的默认 "pip"

所以如果你 运行 这行与 python2 或 python3.

你会得到完全相同的行为

您应该做的是安装两个版本的 pip(pip 用于 python2,pip 用于 python3)。

然后调用 python2-pip install stuff 在您的 python2 安装上安装,然后调用 python3-pip install stuff 在您的 python3 安装上安装。

您似乎在使用 linux。因此,只需使用包管理器安装这两个 pip 包即可。根据您的发行版,python2 的 pip 称为 pip、pip2、pip-python2 或 python2-pip,而 python3 的 pip 可以称为 pip、pip3、pip -python3 或 python3-pip.

运行

pip --version

检查 pip 脚本引用的 python 版本。