【问题标题】:How can I adjust pip3 using python3.6 not python3.4 on Ubuntu 14.04?如何在 Ubuntu 14.04 上使用 python3.6 而不是 python3.4 调整 pip3?
【发布时间】:2019-04-23 18:29:53
【问题描述】:

Ubuntu 14.04 上的默认 python33.4.3,但我想改用 3.6.3

我按照以下命令安装3.6.3

$ sudo apt-get update
$ sudo apt-get install build-essential libpq-dev libssl-dev openssl libffi-dev zlib1g-dev
$ sudo apt-get install python3-pip python3-dev

$ sudo add-apt-repository ppa:jonathonf/python-3.6
$ sudo apt-get update
$ sudo apt-get install python3.6

3.6.3 然后在我的 Ubuntu 上可用:

$ which python3.6
/usr/bin/python3.6

当然,python3 仍然指向3.4.3

$ ls -la /usr/bin/python3
/usr/bin/python3 -> /usr/bin/python3.4

pip3 可用,但它使用 3.4.3 而不是 3.6.3(我想要的):

$ pip3 --version
pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.4)

我认为更新/usr/bin/python3 可以解决问题,所以我调整了python3 符号链接,使其指向3.6.3

$ sudo unlink /usr/bin/python3
$ sudo ln -s /usr/bin/python3.6 /usr/bin/python3
$ ls -la /usr/bin/python3
/usr/bin/python3 -> /usr/bin/python3.6

但是pip3 不再起作用了:(

$ pip3 --version
Traceback (most recent call last):
  File "/usr/bin/pip3", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python3/dist-packages/pkg_resources.py", line 1479, in <module>
    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 20, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "/usr/bin/pip3", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python3/dist-packages/pkg_resources.py", line 1479, in <module>
    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'

更新

我尝试了一些建议:

$ sudo python3.6 -m pip

$ curl https://bootstrap.pypa.io/get-pip.py | sudo -H python3.6

但它显示了非常相似的输出:

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/usr/lib/python3.6/runpy.py", line 142, in _get_module_details
    return _get_module_details(pkg_main_name, error)
  File "/usr/lib/python3.6/runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "/usr/lib/python3/dist-packages/pip/__init__.py", line 59, in <module>
    from pip.log import logger
  File "/usr/lib/python3/dist-packages/pip/log.py", line 9, in <module>
    import colorama, pkg_resources
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 656, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible
  File "/usr/share/python-wheels/setuptools-3.3-py2.py3-none-any.whl/pkg_resources.py", line 1479, in <module>
    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 20, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg

我该如何解决这个问题?

【问题讨论】:

  • 使用pip3.6,或使用python3.6 -m pip
  • Debian / Ubuntu 没有alternatives 系统来切换共享命令吗?
  • @MartijnPieters 我尝试使用$ sudo python3.6 -m pip,但它显示了同样的错误
  • 是的,你真的不想搞乱 Ubuntu 包管理。至少,重新安装 python 软件包。
  • 卸载 pip ,删除 pip 文件夹并使用 python3.6 构建 pip

标签: pip ubuntu-14.04 python-3.6 python-3.4


【解决方案1】:

您好,这里描述了真正的问题:https://stackoverflow.com/a/41722610/7933710 TLDR:在旧 Ubuntu 系统上使用 ppa 并不一致。

要修复您的系统,您必须删除 python3.6:

apt-get remove --purge python3.6
add-apt-repository -r ppa:jonathonf/python-3.6

然后下载源码并从源码编译,准备系统编译:

wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz

现在准备构建系统:

apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev  libncursesw5-dev xz-utils tk-dev

所有这些步骤都来自这里的指南https://realpython.com/installing-python/#compiling-python-from-source

现在配置、制作、制作 altinstall(重要)

tar xvf Python-3.6.7.tgz
cd Python-3.6.7/
./configure --enable-optimizations --with-ensurepip=install
make -j 8
make altinstall

-j 8 表示在 8 个内核上运行。当然,如果您的数量较少,请使用适当的数量。在任何情况下都不会导致崩溃。

现在通过运行验证安装

python3.6 -V
which python3.6

复制python3.6的路径,应该是/usr/bin/python3.6或者/usr/local/bin/python3.6

您现在可以使用update-alternatives 来管理您机器上的所有 python 版本

ls /usr/bin/python*  # e.g. /usr/bin/python2.7 /usr/bin/python3.4 /usr/bin/python3.6
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1
update-alternatives --install /usr/bin/python python /usr/local/bin/python3.6 2

数字2 表示在您的机器上运行python 的优先级。在这种情况下 2 > 1,所以你会更喜欢 python3.6。如果您想更改为 3.4 版,您可以运行 update-alternatives --config python,这是一个交互式配置器。

现在您可以使用python -m pip -V 来验证 pip 是否正常工作。也可以使用 pip3.6 安装包。

【讨论】:

  • 这是一个很好的指南。一条快速的建议:我必须sudo 才能运行make altinstall。有什么理由吗?
  • 另外,对于那里的每个人,--enable-optimizations 标志给我每个stackoverflow.com/questions/47011941/… 的错误
  • @physincubus 我想make altinstall 的目标目录不属于执行命令的用户。至于为什么会出现错误,我认为这是相同的原因。一种解决方法是使用sudo su - 提升为root 权限,尽管这是不赞成的:D
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 2019-03-28
  • 2019-08-09
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多