"Правильный способ" управления несколькими версиями Python на archlinux

Итак, я прочитал это - https://wiki.archlinux.org/index.php/Python

и из этой Вики ясно, что я могу установить Python 2.7.2 через

pacman -S python2

разумно ли для меня создать символическую ссылку на python2

ln -s python2 /usr/bin/python

Если я не предвижу себя переход на python 3.0 в ближайшее время? Или есть лучший способ управления несколькими версиями python, как то, что я обычно использую в системе debian (update-alternatives --config python) или в системе mac os x (выбор python)?

пояснение:

  • то, что я пытаюсь выяснить, - что такое "лучшая практика" управления различными версиями python в системе archlinux?
  • я новичок в archlinux, но знаком с ubuntu, debian и mac os x

7 ответов


большинство Юнисов уже имеют /usr/bin / python. Перезапись этого-плохая идея, так как это версия Python, используемая всеми пакетами в системе, и изменение этого может их сломать. При установке пакета Python 2.7 исполняемый файл должен быть установлен как /usr/bin / python2.7 (если нет, я бы сказал, что Archlinux сломан), и лучше использовать это, когда вы хотите запустить Python 2.7.

Archlinux немного особенный, так как он будет использовать /usr / bin / python для Python 3, несмотря на имя исполняемого файла по умолчанию для Python 3 - / usr/bin / python3. Это сбивает с толку и может рассматриваться как ошибка, но это означает, что вы не можете использовать эту символическую ссылку для Python 2, так как любой другой скрипт Archlinux, который использует Python 3, почти наверняка сломается, если вы это сделаете.

Итак, где на других Unices, symlinking / usr/bin / python для Python 2.7-плохая идея, на Archlinux это ужасная идея. Вместо этого просто установите всю необходимую версию и вызовите их с помощью /usr/bin/pythonX.Х.


Я бы сказал, что вы вообще не должны создавать такие символические ссылки. Особенно, если вы собираетесь распространять некоторый код python, вы не должны предполагать, что пользователь имеет python2 или python3 в /usr/bin/python.

Если ваш скрипт требует python2, просто используйте:

#!/usr/bin/env python2

Если ваш скрипт требует python3, используйте:

#!/usr/bin/env python3

таким образом, ваши скрипты будут работать нормально даже через обновления для Python. Также будет намного понятнее, какая версия вашего скрипта на самом деле нужно.


есть хороший проект на github, который помогает вам с ним называется pyenv Что помогает вам управлять несколькими экземплярами python


как говорили другие, короткий ответ:" не делайте этого, это, скорее всего, сломает вещи в вашей системе", однако, если вы в основном используете Python 2, вы все равно можете установить свой личный дефолт в своей оболочке (и все еще иметь возможность переключиться на Python 3 в любое время). Для этого сначала станьте root и установите python2-virtualenv:

# pacman -S python2-virtualenv

затем создайте виртуальную среду, использующую Python 2 (это автоматически установит Python, setuptools, wheel и pip в environment):

$ virtualenv -p /usr/bin/python2 --system-site-packages ~/env # (Or wherever you want your environment to live)

если вы хотите использовать только локально установленные пакеты (например. пакеты, которые вы устанавливаете с помощью pip, а не те, которые установлены pacman) удалить --system-site-packages опция при создании среды.

теперь в вашей ~/.bash_profile или ~/.profile (или независимо от предпочтительного файла конфигурации оболочки), установите что-то вроде следующего:\

source ~/env/bin/activate

это активирует виртуальную среду, делая вашу версию Python по умолчанию 2.

это все равно может сломать все, что запускается в оболочке, но маловероятно, что что-либо будет, если вы явно не запускаете его из оболочки, и в этот момент Вы можете отключить виртуальную среду, выполнив:

deactivate

или просто вручную запустите Python 3.


нет, нет лучшего способа сделать это. The python symlink является частью пакета Python 3.

Я думаю, что изменение этой ссылки ничего не сломает, но возможно, что некоторые пакеты будут зависеть от нее в будущем.


Я просто споткнулся об этот пост, без некро-ударов, но мне было интересно, что никто не упоминал virtualenvs. Я также использую ArchLinux, и я использую пакеты python virtualenv и virtualenvwrapper для создания нескольких сред python. Вы можете ссылаться на двоичные файлы python 2 или python3 в /usr/bin/, чтобы определить версию python, используемую в виртуальной среде.

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


Я знаю, что это может быть очень старый ответ, но мне потребовалось два дня, чтобы решить проблему, поэтому я собираюсь поделиться.

на правильный способ управления версиями python в вашей системе для работы над различными проектами без них сводит вас с ума, чтобы использовать pyenv и плагины pyenv-virtualenv и pyenv-virtualenvwrapper как описано Энрике Бастос в этот блог. Обратите внимание, что этот способ работы вроде независимая от платформы, так как pyenv-это пакет python, и его можно запускать аналогично в Windows, Linux и Mac OSx.

проблемы начинаются с Arch Linux. ОС не предоставляет версию pyenv pacman, поэтому вам нужно установить ее клонирование из github, как описано в раздел установки выпуска. Процесс установки одинаков как для pyenv-virtualenv, так и для pyenv-virtualenvwrapper. Обратите внимание, что инициализация оболочки конфигурация может быть другой, в моем случае это не сработало для ~/.файл, но работал на ~/.bashrc следующее .

запуск pyenv не является простым, если ваша установка очень свежая, как тот, который я настраиваю в эти дни, так как pip требует openSSL, и даже если вы установите его через pacman, pyenv не видит его. Итак, если вы хотите установить более старую версию Python (а именно 3.4.3), вы найдете оболочку, жалующуюся на то, что вы не установили плагин openSSL,даже если у вас есть это. Честно говоря, у меня не было правильных пакетов при первой попытке установить его; вы должны загрузить следующие пакеты

sudo pacman -S openssl
sudo pacman -S openssl-1.0
sudo pacman -S python-pyopenssl
sudo pacman -S python2-pyopenssl

кстати я решил проблему-добавить флаги, как описано в pyenv установка Часто задаваемые вопросы: это решение в конечном итоге привело меня к установке версии python, которую я хотел:

LDFLAGS="-L/usr/lib/openssl-1.0" \
CFLAGS="-I/usr/include/openssl-1.0" \
pyenv install -v 3.4.3

чтобы избежать перехода на страницу Часто задаваемые вопросы каждый раз, когда вы хотите обновить среду установки python, вы можете добавить alias в ~/.bashrc или что вы shell следующим образом:

echo alias pyenv='LDFLAGS="-L/usr/lib/openssl-1.0" \
    CFLAGS="-I/usr/include/openssl-1.0" \
    pyenv' >> ~/.bashrc

таким образом, вы можете правильно установить python с чистым синтаксисом pyenv и управлять им через его плагины таким же образом (поскольку синтаксис pyenv [COMMAND] [OTHERSTUFF]).