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