Как правильно управлять несколькими версиями Python?


21

У меня есть машина с Python 2.6, установленным в качестве Python по умолчанию. Затем я установил Python 2.7 и вручную создал / usr / bin / python как символическую ссылку на новую установку.

Затем у меня возникли проблемы с командой not-found . Я пытаюсь переустановить его:

sudo apt-get remove command-not-found

и я получаю эту ошибку:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Но я действительно хочу, чтобы Python 2.7 был по умолчанию. Как мне исправить этот беспорядок?

Ответы:


16

Изменение Python по умолчанию (или Perl и т. Д.) В ОС - это действительно плохая идея. Этот интерпретатор на самом деле является частью ОС, и вполне могут быть и другие компоненты ОС, написанные специально для работы с этой версией интерпретатора.

Например, в Redhat инструмент yum, который выполняет обновления системного программного обеспечения, представляет собой приложение python. Вы действительно не хотите сломать это. Такие приложения могут зависеть от конкретных, возможно, нестандартных устанавливаемых модулей Python, которых может не иметь установленная версия. Например, в Ubuntu я полагаю, что некоторые встроенные инструменты ОС, написанные на Python, используют ORM под названием Storm, который не является частью стандартной библиотеки Python. Ваша чистая установка Python 2.7 имеет определенную ожидаемую версию установленного модуля Storm? Есть ли у него версия Storm? Нет? Тогда вы только что разбили кусок своей ОС.

Правильный способ сделать это - установить предпочитаемую версию python и настроить свою учетную запись пользователя, чтобы использовать ее, указав свой .bash_profile, путь и так далее. Вы также можете заглянуть в модуль virtualenv для Python.


1
Погуглил мой путь сюда. Был бы -1, если бы у меня был представитель в этом стеке. Почему? Поскольку предлагаемый подход говорит только «установите предпочитаемую версию Python». Как это сделать без использования системного питона?
Jez

@jez Пользователи должны обратиться к инструкциям по установке для своего приложения и выбранной комбинации ОС. В общем случае языковые установочные пакеты будут устанавливаться в безопасном месте, а не перезаписывать основные компоненты ОС, поэтому перезапись версии ОС будет особым случаем.
Саймон Хиббс

8

Как мне исправить этот беспорядок?

Ничего больше, чем переустановка python. Это отменит ваше изменение (символическая ссылка).

Почему вы хотите по умолчанию? Каждый раз, когда вам это нужно, просто используйте python2.7или включите #!/usr/bin/python2.7(шебанг) ​​в начале ваших (исполняемых) скриптов.

Если вы настаиваете на python2.7использовании общесистемного значения по умолчанию, используйте более позднюю версию Ubuntu (в настоящее время это Ubuntu 11.04 под кодовым названием Natty). Эта версия используется по умолчанию.

В будущем избегайте ручных вмешательств, таких как то, что вы делали с символической ссылкой. Это особенно верно для файлов, управляемых дистрибутивами, и особенно для сложных животных, таких как Python.


Я подумал, что разумно изменить установку Python по умолчанию после обновления. Я хочу это по умолчанию, потому что я хочу работать с более новым питоном ... по умолчанию. Когда я печатаю pythonиз bash, я хочу получить новый питон. Есть ли лучший способ сделать это, чем я?
ripper234

Просто заметьте - я не думаю, что в установке Python 2.7 было что-то не так. Единственным «неортодоксальным» шагом было изменение символической ссылки, которая, как я думал, была правильным способом установить ее по умолчанию. Есть ли способ лучше?
ripper234

2
@ripper: Я думаю, что я приду к этой теме немного поздно. Как говорит Tshepang, pythonпакет в Ubuntu определяет версию системы. Теперь можно настроить вашу установку так, чтобы Python 2.7 был по умолчанию, создав собственный пакет Python и т. Д., Но если это так, вы фактически станете сопровождающим вашей установки Python вместо Ubuntu, и вам придется узнать, как Python управляется в Debian / Ubuntu. Имейте в виду, что другие пакеты Python в системе настроены для работы с 2.6 по умолчанию, поэтому, кроме всего прочего, может произойти поломка.
Фахим Митха

1
@Tshepang: Хорошее резюме!
Фахим Митха

12
@ ripper234: Ничего не меняйте /usr/bin, это зарезервировано для вашего дистрибутива. Вместо этого сделайте /usr/local/bin/pythonсимволическую ссылку на python2.7. Тогда скрипты, использующие #!/usr/bin/env python(рекомендуемая идиома), а также набрав pythonв командной строке, запустят Python 2.7. Скрипты из дистрибутива, которые хотят Python от дистрибутива, могут продолжать вызывать #!/usr/bin/python.
Жиль "ТАК - перестань быть злым"

2

Отказ от ответственности: я только что опубликовал этот же ответ на переполнение стека:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

Вот мой взгляд на проблему. Работает на Python3. Основными функциями являются:

  • Каждая версия Python скомпилирована из исходного кода
  • Все версии установлены локально
  • Никоим образом не портит установку Python по умолчанию в вашей системе.
  • Каждая версия Python изолирована с помощью virtualenv

Шаги следующие:

  1. Если у вас есть несколько дополнительных версий Python, установленных каким-либо другим способом, избавьтесь от них, например, удалите $ HOME / .local / lib / python3.x и т. Д. (Также глобально установленные). Не трогайте версию Python3 по умолчанию вашей системы.

  2. Загрузите исходный код для различных версий Python в следующей структуре каталогов:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. В каждом каталоге «Python-3.xy /» выполните следующее ( НЕ используйте «sudo» ни на одном из шагов!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. В "python_versions /" создайте файлы вроде этого:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Теперь, когда вы захотите выбрать python3.x, сделайте

    source $HOME/python_versions/env_python3x.bash

    войти в virtualenv

  6. Находясь в virtualenv, установите ваши любимые пакеты python с

    pip install --upgrade package_name
  7. Для выхода из версии virtualenv и python просто введите «деактивировать»


0

Мы поместили несколько дистрибутивов Python для Mac и Ubuntu, и вот моя рекомендация.

  1. Оставьте системный питон безмолвным: никогда не используйте его.

  2. Если вам нужен только один основной дистрибутив Python, скачайте и установите Canopy с enthought. Когда он установится, выберите «установить как мой системный питон», и затем вы сможете установить пакеты из диспетчера пакетов Canopy.

    • Canopy также совместим из коробки с pipкомандой менеджера пакетов PyPi, которая позволяет вам устанавливать пакеты (например pip install python-twitter)
  3. Если вы планируете использовать виртуальные среды (т.е. вы разрабатываете программы на Python и хотите, чтобы для каждой из них была выделенная чистая среда Python с простым средством переключения между ними), я бы рекомендовал Anaconda поверх Canopy из-за инструмента управления виртуальной средой . Это позволит вам

0

pyenv

https://github.com/pyenv/pyenv

Pyenv позволяет вам управлять несколькими версиями Python без sudo для одного пользователя, так же, как Node.js NVM и Ruby RVM .

Установите Pyenv:

curl https://pyenv.run | bash

Затем добавьте в свой .bashrc:

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Найдите версию Python для установки:

pyenv install --list

Установите нужную версию Python:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo 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 libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Список доступных версий Python:

pyenv versions

Теперь у нас есть:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Выберите другую версию Python:

pyenv global 3.8.0
python --version
python3 --version

Оба вывода:

Python 3.8.0

Теперь мы можем приступить к установке и использованию пакетов в обычном режиме:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Мы можем подтвердить, что все локально установлено в нашем чистом окружении с помощью:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

За использование проекта

В предыдущем разделе мы увидели, как использовать pyenv в глобальной настройке.

Однако, как правило, вам нужно установить конкретную версию Python и пакета для каждого проекта. Вот как это сделать.

Сначала установите желаемую версию Python, как и раньше.

Затем из каталога вашего проекта установите желаемую версию Python с помощью:

pyenv local 3.8.0

который создает файл .python-version содержащий строку версии.

А теперь давайте установим пакет локально только для нашего проекта: TODO: нет хорошего способа, которым это кажется: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Теперь, когда кто-то хочет использовать ваш проект, он будет делать:

pyenv local

который устанавливает правильную версию Python.

Связанные темы:

Проверено на Ubuntu 18.04, pyenv 1.2.15.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.