如何在Ubuntu 16.10上为Python 3.6安装pip?

55

我想先指出这个问题可能看起来像是重复的,但实际上不是。我在这里看到的所有问题都涉及Python 3的pip,而我谈论的是Python 3.6。那时使用的步骤对于Python 3.6无效。

  1. 我从官方docker商店中获得了一个干净的Ubuntu 16.10映像。
  2. 运行apt-get update
  3. 运行apt-get install python3.6
  4. 运行apt-get install python3-pip
  5. 运行pip3 install requests bs4
  6. 运行python3.6 script.py

以下是ModuleNotFoundError

 Traceback (most recent call last):
    File "script.py", line 6, in <module>
     import requests
 ModuleNotFoundError: No module named 'requests'

我机器里有Python和pip:

python3
python3.5
python3.5m
python3.6
python3m
python3-config
python3.5-config
python3.5m-config
python3.6m
python3m-config  

pip
pip3
pip3.5

尝试下载并运行 https://bootstrap.pypa.io/get-pip.py。 - OmerBA
5个回答

105

假设你有一个运行Ubuntu 16.04、16.10或17.04的系统,并且你想让Python 3.6成为默认的Python。

如果你正在使用Ubuntu 16.04 LTS,你需要使用PPA:

sudo add-apt-repository ppa:jonathonf/python-3.6  # (only for 16.04 LTS)

然后,运行以下命令(在 Ubuntu 16.10 和 17.04 上可以直接使用):

sudo apt update
sudo apt install python3.6
sudo apt install python3.6-dev
sudo apt install python3.6-venv
wget https://bootstrap.pypa.io/get-pip.py
sudo python3.6 get-pip.py
sudo ln -s /usr/bin/python3.6 /usr/local/bin/python3
sudo ln -s /usr/local/bin/pip /usr/local/bin/pip3

# Do this only if you want python3 to be the default Python
# instead of python2 (may be dangerous, esp. before 2020):
# sudo ln -s /usr/bin/python3.6 /usr/local/bin/python

完成上述步骤后,以下每个shell命令都应显示Python 3.6.1(或更高版本的Python 3.6):

python --version   # (this will reflect your choice, see above)
python3 --version
$(head -1 `which pip` | tail -c +3) --version
$(head -1 `which pip3` | tail -c +3) --version

3
我认为应该是 sudo ln -s /usr/local/bin/pip3.6 /usr/local/bin/pip3,因为 pip3 默认链接到系统上安装的默认 pip3.x - JChris
在我提供的示例中,pip是通过sudo python3.6 get-pip.py安装的,路径为/usr/local/bin/pip,并且被别名为/usr/local/bin/pip3。系统上没有/usr/local/bin/pip3.6 - Miles Erickson
1
哦,好的。我现在明白了。我创建了一个Ubuntu Server 17.04用于测试,开箱即用只有Python 3.5.x,没有关于Python 2.x的任何内容,也没有安装pip。通过apt install python3.6 / -dev / -env,我得到了Python 3.6.x,但是python3符号链接仍然指向默认的Python 3.5.x,这是预期的。然后,简单的sudo ln -s /usr/bin/python3.6 /usr/local/bin/python就解决了问题。然后使用wget get-pip.py并使用python(在符号链接之后是Python 3.6.x)运行它,就完成了。我现在将您的答案标记为正确的,因为它比旧的更清洁。 - JChris
5
FWIW,PEP 0394并未建议以下操作:sudo ln -s /usr/bin/python3.6 /usr/local/bin/python - anthony sottile
5
根据《PEP 394》规定,“只要安装了任何版本的Python 2,就应该安装更通用的python命令,并调用与python2相同的Python版本”。在Ubuntu 16上将python3.6链接到python可能存在风险。 - Asclepius
显示剩余3条评论

36
在至少ubuntu 16.10中,默认的python3版本是python3.5。因此,所有python3-X包都将安装在python3.5而不是python3.6上。
您可以通过检查pip3的shebang来验证这一点:
$ head -n1 $(which pip3)
#!/usr/bin/python3

庆幸的是,由python3-pip软件包安装的pip被安装到“共享”/usr/lib/python3/dist-packages中,以便python3.6也可以利用它。

您可以通过以下方式为python3.6安装软件包:

python3.6 -m pip install ...
例如:
$ python3.6 -m pip install requests
$ python3.6 -c 'import requests; print(requests.__file__)'
/usr/local/lib/python3.6/dist-packages/requests/__init__.py

@Anthony Sottile,如何将Python 3.6设置为默认版本,有什么建议吗? - Soumendra
使python3.6成为pip的默认版本的一种方法是创建一个可执行文件,命名为“pip”,但本质上执行的是exec python3.6 -m pip -- 将其放置在~/bin/usr/local/bin中。不建议替换操作系统默认的python3可执行文件,这会导致操作系统不稳定。 - anthony sottile
2
当我尝试这个时,出现了“没有名为pip的模块”。 - Turtles Are Cute
1
@TurtlesAreCute,你是否已经通过apt安装了python-pip - anthony sottile
1
@TurtlesAreCute,从测试结果来看,这可能意味着您曾经运行过sudo pip install pip --upgrade命令,这将把pip移动到py35 dist-packages中。您可以使用sudo apt install --reinstall python-pip命令获取旧版本,或者按照上面的评论建议使用python3.6和get-pip.py - anthony sottile
显示剩余2条评论

12
这个答案假设您已经安装了python3.6。对于python3.7,请用3.7替换3.6。对于python3.8,请用3.8替换3.6,但这可能需要先安装python3.8-distutils包。

使用sudo进行安装

关于安装pip,使用curl(而不是wget)可以避免将文件写入磁盘。
curl https://bootstrap.pypa.io/get-pip.py | sudo -H python3.6

sudo在安装更新的Python解释器时,使用-H标志显然是必要的,以避免出现以下错误:

目录“/home/someuser/.cache/pip/http”或其父目录不属于当前用户,并且缓存已被禁用。请检查该目录的权限和所有者。如果使用sudo执行pip,则可能需要sudo的-H标志。

目录“/home/someuser/.cache/pip”或其父目录不属于当前用户,并且已禁用缓存轮子。检查该目录的权限和所有者。如果使用sudo执行pip,则可能需要sudo的-H标志。

无需sudo进行安装

curl https://bootstrap.pypa.io/get-pip.py | python3.6 - --user

有时会出现如下警告:

警告:脚本wheel已安装在“/home/ubuntu/.local/bin”中,该目录不在PATH中。考虑将此目录添加到PATH中。如果您想要抑制此警告,请使用--no-warn-script-location。

验证

完成后,可以预期pippip3pip3.6都指向同一个目标:

$ (pip -V && pip3 -V && pip3.6 -V) | uniq
pip 18.0 from /usr/local/lib/python3.6/dist-packages (python 3.6)

当然,您也可以选择使用 python3.6 -m pip

$ python3.6 -m pip -V
pip 18.0 from /usr/local/lib/python3.6/dist-packages (python 3.6)

1
这是唯一在Ubuntu 16.04上对我有效的答案。谢谢。 - james-see

3
本网站提供更清洁的解决方案,它保留pip不变,用户可以轻松地在3.5和3.6之间切换,直到3.7发布。以下是一个简短的摘要:http://ubuntuhandbook.org/index.php/2017/07/install-python-3-6-1-in-ubuntu-16-04-lts/
sudo apt-get install python python-pip python3 python3-pip
sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2

那么

$ pip -V
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
$ pip3 -V
pip 8.1.1 from /usr/local/lib/python3.5/dist-packages (python 3.5)

然后选择运行Python 3.6

sudo update-alternatives --config python3

选择“2”。然后

$ pip3 -V
pip 8.1.1 from /usr/local/lib/python3.6/dist-packages (python 3.6)

要更新pip,请选择所需的版本并执行以下命令:

pip3 install --upgrade pip

$ pip3 -V
pip 9.0.1 from /usr/local/lib/python3.6/dist-packages (python 3.6)

在Ubuntu 16.04上进行了测试。


请注意。目前Python 3.6的pip中尚未提供“apt_pkg”软件包,这意味着某些命令(如“apt-add-repository”)可能无法正常工作。 - genetica
1
在Ubuntu上,Python 3与操作系统紧密集成,因此不同版本不是替代方案,您不应更改符号链接/usr/bin/python3。这可能会导致问题。例如,您的终端可能无法打开 - wjandrea

3

之前一些使用脚本get-pip.py的解决方案在几周前还有效。

此脚本的最新版本现在需要python3.7,否则会报以下错误

ERROR: This script does not work on Python 3.6 
The minimun supported Python version is 3.7. 
Please use https://bootstrap.pypa.io/pip/3.6/get-pip.py instead.

因此,进行相应的更改现在可以正常工作。

wget https://bootstrap.pypa.io/pip/3.6/get-pip.py
sudo python3.6 get-pip.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接