Який правильний спосіб керувати кількома версіями python?


21

У мене встановлена ​​машина з Python 2.6 як Python за замовчуванням. Потім я встановив Python 2.7 та створив / вручну / usr / bin / python як символьне посилання на нову установку.

Потім у мене виникли проблеми з командою не знайдено . Я намагаюся його перевстановити:

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? Чи є в ньому версія «Шторм»? Ні? Тоді ви просто зламали шматок вашої ОС.

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


1
Гугл мій шлях сюди. Був би -1, якби я мав представник у цій стеці. Чому? Тому що запропонований підхід говорить лише про "встановити бажану версію python". Як це зробити без шлангу системного пітона?
яд

@jez Користувачі повинні звернутися до інструкцій із встановлення програми та комбінації ОС на вибір. Взагалі пакети програм інсталятора встановлять у доброякісне місце, а не перезаписують основні компоненти ОС, тому перезапис версії ОС буде особливим випадком.
Simon Hibbs

8

Як виправити цей безлад?

Не більше ніж перевстановлення python. Це скасує вашу зміну (посилання).

Чому ви хочете це за замовчуванням? Кожен раз, коли вам це потрібно, просто використовуйте python2.7або додайте #!/usr/bin/python2.7(shebang) на початку своїх (виконуваних) сценаріїв.

Якщо ви наполягаєте на тому, що за python2.7умовчанням використовується загальносистемна система, використовуйте більш пізню версію Ubuntu (на даний момент це Ubuntu 11.04 з кодовою назвою Natty). Він використовує цю версію за замовчуванням.

Надалі уникайте втручань вручну, як, наприклад, те, що ви робили з річчю "симлінк" Особливо це стосується файлів, керованих дистрофією, і особливо для складних звірів, таких як установки Python.


Я подумав, що розумно змінити установку python за замовчуванням лише після того, як я оновив. Я хочу його як за замовчуванням, тому що я хочу працювати з новішим python ... як за замовчуванням. Коли я друкую pythonз bash, я хочу отримати новий пітон. Чи є кращий спосіб зробити це, ніж те, що я зробив?
ripper234

Зауважу лише. Я не думаю, що в тому, як я встановив python 2.7, не було нічого поганого. Єдиним "неортодоксальним" кроком було зміна симпосилання, що я вважав правильним способом встановити її за замовчуванням. Чи є кращий спосіб?
ripper234

2
@ripper: Я думаю, я трохи пізно заходжу до цієї теми. Як каже Цхепанг, pythonпакет Ubuntu визначає версію системи. Тепер можна налаштувати вашу установку, щоб python 2.7 був за замовчуванням, створивши власний пакет python тощо. управляється на Debian / Ubuntu. Майте на увазі, що інші пакети Python в системі налаштовані на роботу з 2.6 за замовчуванням, тому, крім усього іншого, може виникнути поломка.
Faheem Mitha

1
@Theheng: Хороший підсумок!
Faheem Mitha

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 ізольована віртуальнв

Кроки такі:

  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. Коли він встановлюється, виберіть "встановити як мій системний пітон", а потім ви можете встановити пакети з менеджера пакунків GUI 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

Виберіть іншу версію пітона:

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, як і раніше.

Потім зсередини каталогу каталогу встановіть потрібну версію пітона за допомогою:

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.