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

时间:2015-03-21 13:36:09

标签: python python-2.7 python-3.x pip setuptools

我正在尝试一个简单的代码段,通过以下脚本升级我所有的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,但仍然是同样的问题。

那我哪里错了?

1 个答案:

答案 0 :(得分:0)

您的电话

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

是系统调用,在您的系统上运行默认的“pip”

因此,如果使用python2或python3运行此行,您将获得完全相同的行为。

你应该做的是安装两个版本的pip(ppi用于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版本。