Quelle est la bonne façon de gérer plusieurs versions de python?

21

J'ai une machine avec Python 2.6 installé comme Python par défaut. Ensuite, j'ai installé Python 2.7 et créé manuellement / usr / bin / python comme lien symbolique vers la nouvelle installation.

Ensuite, je rencontrais des problèmes avec la commande introuvable . J'essaye de le réinstaller:

sudo apt-get remove command-not-found

et je reçois cette erreur:

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

Mais je veux vraiment que Python 2.7 soit la valeur par défaut. Comment puis-je réparer ce désordre?

ripper234
la source

Réponses:

16

Changer le Python par défaut (ou Perl, etc.) sur un OS est vraiment une mauvaise idée. Cet interpréteur fait en fait partie du système d'exploitation et il se peut bien que d'autres composants du système d'exploitation soient écrits spécifiquement pour fonctionner avec cette version de l'interpréteur.

Par exemple, sur Redhat, l'outil yum qui effectue les mises à jour du logiciel système est une application python. Vous ne voulez vraiment pas casser ça. Ces applications peuvent dépendre de modules python spécifiques, peut-être non standard, que la version que vous avez installée peut ne pas avoir. Par exemple, sur Ubuntu, je pense que certains des outils de système d'exploitation intégrés écrits en Python utilisent un ORM appelé Storm qui ne fait pas partie de la bibliothèque standard de Python. Est-ce que votre propre installation de Python 2.7 a la version attendue spécifique du module Storm installée? A-t-il une version de Storm? Non? Ensuite, vous venez de casser une partie de votre système d'exploitation.

La bonne façon de le faire est d'installer votre version préférée de python et de configurer votre compte d'utilisateur pour l'utiliser en configurant votre .bash_profile, chemin d'accès et autres. Vous pourriez également vouloir examiner le module virtualenv pour Python.

Simon Hibbs
la source
1
Googlé mon chemin ici. Serait -1 si j'avais le représentant sur cette pile. Pourquoi? Parce que l'approche suggérée dit seulement "installez votre version préférée de python". Comment cela se fait sans arroser le système python?
2015
@jez Les utilisateurs doivent se référer aux instructions d'installation pour leur combinaison d'application et de système d'exploitation de leur choix. En général, les packages d'installation de langue s'installent dans un emplacement bénin, ne remplacent pas les composants principaux du système d'exploitation, donc le remplacement de la version du système d'exploitation serait le cas spécial.
Simon Hibbs
8

Comment puis-je réparer ce désordre?

Rien de plus qu'une réinstallation python. Il annulera votre modification (le lien symbolique).

Pourquoi le voulez-vous par défaut? Chaque fois que vous en avez besoin, utilisez python2.7ou incluez #!/usr/bin/python2.7(le shebang) au début de vos scripts (exécutables).

Si vous insistez pour avoir python2.7comme valeur par défaut à l'échelle du système, utilisez une version ultérieure d'Ubuntu (actuellement c'est Ubuntu 11.04, nommé Natty). Il utilise cette version par défaut.

À l'avenir, évitez de faire des interventions manuelles comme ce que vous avez fait avec le lien symbolique. Cela est particulièrement vrai pour les fichiers gérés par distro, et plus particulièrement pour les bêtes complexes comme les installations Python.

tshepang
la source
Je pensais qu'il n'était raisonnable de changer l'installation par défaut de python qu'une fois la mise à niveau effectuée. Je le veux par défaut parce que je veux travailler avec le nouveau python ... par défaut. Lorsque je tape pythondepuis bash, je veux obtenir le nouveau python. Y a-t-il une meilleure façon de faire cela que ce que j'ai fait?
ripper234
Juste pour noter - je ne pense pas qu'il y ait quelque chose de mal dans la façon dont j'ai installé python 2.7. Le seul mouvement "peu orthodoxe" consistait à changer le lien symbolique, ce que je pensais être la bonne façon de le définir par défaut. Y a-t-il une meilleure façon?
ripper234
2
@ripper: Je suppose que j'arrive sur ce sujet un peu en retard. Comme le dit Tshepang, le pythonpackage sur Ubuntu détermine la version du système. Maintenant, il est possible de personnaliser votre installation afin que python 2.7 soit par défaut en créant votre propre package python, etc., mais si c'est le cas, vous deviendrez effectivement le responsable de votre installation Python au lieu d'Ubuntu, et vous devrez apprendre comment Python est géré sur Debian / Ubuntu. Gardez à l'esprit que les autres packages Python du système sont configurés pour fonctionner avec 2.6 par défaut, donc, en dehors de toute autre chose, une rupture peut en résulter.
Faheem Mitha
1
@Tshepang: Bon résumé!
Faheem Mitha
12
@ ripper234: Ne changez rien /usr/bin, c'est réservé à votre distribution. Faites plutôt /usr/local/bin/pythonun lien symbolique vers python2.7. Ensuite, les scripts utilisant #!/usr/bin/env python(l'idiome recommandé), ainsi que la saisie pythonsur la ligne de commande, exécuteront Python 2.7. Les scripts de la distribution qui veulent le Python de la distribution peuvent continuer à appeler #!/usr/bin/python.
Gilles 'SO- arrête d'être méchant'
2

Avertissement: je viens de poster cette même réponse pour déborder de pile:

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

Voici mon point de vue sur le problème. Fonctionne pour Python3. Les principales caractéristiques sont:

  • Chaque version Python est compilée à partir des sources
  • Toutes les versions sont installées localement
  • Ne modifie en aucune façon l'installation Python par défaut de votre système
  • Chaque version de Python est isolée avec virtualenv

Les étapes sont les suivantes:

  1. Si plusieurs versions supplémentaires de Python sont installées d'une autre manière, supprimez-les, par exemple, supprimez $ HOME / .local / lib / python3.x , etc. (également celles installées globalement). Ne touchez pas cependant à la version par défaut de votre système python3.

  2. Téléchargez la source pour différentes versions de python sous la structure de répertoires suivante:

    $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. Dans chaque répertoire "Python-3.xy /", procédez comme suit (n'utilisez PAS "sudo" dans aucune des étapes!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. Dans "python_versions /", créez des fichiers comme celui-ci:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Maintenant, chaque fois que vous souhaitez opter pour python3.x, faites

    source $HOME/python_versions/env_python3x.bash

    entrer dans le virtualenv

  6. Dans virtualenv, installez vos packages python préférés avec

    pip install --upgrade package_name
  7. Pour quitter la version virtualenv et python, tapez simplement "désactiver"

El Sampsa
la source
0

Nous mettons beaucoup de distributions python sur Mac et Ubuntu et voici ma recommandation.

  1. Laissez le système python sans souci: ne l'utilisez jamais.

  2. Si vous n'avez besoin que d'une seule distribution Python principale, téléchargez et installez Canopy depuis Enthought. Quand il s'installe, choisissez "définir comme mon python système", puis vous pouvez installer des packages à partir du gestionnaire de packages GUI de Canopy.

    • Canopy est également compatible avec pipla commande PyPi package manager qui vous permet d'installer des packages (par exemple pip install python-twitter)
  3. Si vous prévoyez d'utiliser des environnements virtuels (c.-à-d. Que vous développez des programmes python et que vous voulez un environnement python propre dédié pour chacun, avec un moyen facile de basculer entre eux), je recommanderais Anaconda sur Canopy en raison de son outil de gestionnaire d'environnement virtuel . Cela vous permettra
Adam Hughes
la source
0

pyenv

https://github.com/pyenv/pyenv

Pyenv vous permet de gérer plusieurs versions Python sans sudo pour un seul utilisateur, un peu comme Node.js NVM et Ruby RVM .

Installez Pyenv:

curl https://pyenv.run | bash

Ajoutez ensuite à votre .bashrc:

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

Trouvez la version Python à installer:

pyenv install --list

Installez la version python que vous souhaitez:

# 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

Liste des versions Python disponibles:

pyenv versions

Nous avons maintenant:

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

Sélectionnez une autre version de python:

pyenv global 3.8.0
python --version
python3 --version

Les deux sorties:

Python 3.8.0

Nous pouvons maintenant procéder à l'installation et à l'utilisation des packages normalement:

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

Nous pouvons confirmer que tout est installé localement dans notre environnement propre avec:

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

Utilisation par projet

Dans la section précédente, nous avons vu comment utiliser pyenv dans une configuration globale.

Cependant, ce que vous voulez généralement est de définir une version spécifique de python et de package par projet. Voici comment faire.

Installez d'abord la version Python souhaitée comme précédemment.

Ensuite, depuis l'intérieur de votre répertoire de projet, définissez la version python souhaitée avec:

pyenv local 3.8.0

qui crée un fichier .python-versioncontenant la chaîne de version.

Et maintenant, installons un package localement juste pour notre projet: TODO: il n'y a pas de façon sympa qu'il semble: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Maintenant, quand quelqu'un veut utiliser votre projet, il fera:

pyenv local

qui définit la version Python sur la bonne.

Sujets associés:

Testé sur Ubuntu 18.04, pyenv 1.2.15.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source