web-dev-qa-db-fra.com

Trop de versions différentes Python sur mon système et posant des problèmes

Au cours des dernières années, j'ai installé de nombreuses Python avec diverses versions Python. Pour les rendre immédiatement opérationnelles, je les ai installées à l'aveuglette, sans contrôle. Actuellement ils causent des problèmes lorsque j'ai essayé d'installer pynest qui appelle numpy, scipy et matplotlib. Après avoir lutté, je vais nettoyer et réinstaller Python et les bibliothèques.

Après enquête, j’ai trouvé Python 2.5/2.6/2.7/3.2 sur mon système, et chacun d’entre eux contient des copies ou d’autres choses à: (mon système d’exploitation == Mac OS X 10.7.5 Lion )

  • /Library/Frameworks/
  • /opt/local/Library/Frameworks/
  • /opt/local/bin/
  • /Applications/
  • /usr/local/bin/
  • /usr/bin/
  • /System/Library/Frameworks/

Je sais que je suis fou d'avoir ces derniers. Maintenant, j'ai enlevé toutes ces choses sauf les choses dans /System/Libarary/Frameworks (Je ne retire jamais rien de /System/Library/). Après le nettoyage, which python Donne maintenant /usr/bin/python Qui renvoie à /System/Library/Frameworks.

Maintenant, est-ce un environnement clair pour moi de réinstaller python? Comment vérifier qu'il n'y a pas d'autres versions existantes? Comment dois-je les réinstaller pour m'assurer qu'ils et leurs bibliothèques ne seront pas partout et qu'ils auront à nouveau de nombreuses copies?

Je souhaite installer un propre Python 2.7 sur un emplacement approprié et faire en sorte que mon système sache exactement où il se trouve et n’installez jamais de bibliothèque ailleurs. Merci de me donner quelques conseils pour le gérer comme de manière professionnelle.

Pour votre information, voici mon $PATH Actuel, je pense qu'il devrait être modifié:

/opt/local/bin:/opt/local/sbin:/opt/nest/lib/python2.7/site-packages:/usr/local/lib/python2.7/site-packages:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/texbin:/Library/Frameworks/Python.framework/Versions/3.2/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/Django/bin:/usr/X11/bin:/opt/local/bin:/opt/local/sbin:/usr/local/lib/python2.7/site-packages:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.2/bin

S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations. Merci!


[~ # ~] met à jour [~ # ~] :

Je repense sans cesse pourquoi cela devient si fou. Je crois que c'est parce que j'ai installé des choses via:

  • easy_install/macports/homebrew/fink/pip parfois;
  • .dmg Parfois;
  • .pkg Parfois;
  • compiler le code source parfois;

et ils ont fait des choses à différents endroits. Je me demande quel est le mécanisme derrière ces moyens? Comment choisissent-ils l'emplacement cible? Comment les empêcher de tout gâcher?

54
Skyler

Pourquoi a-t-il été gâché?

Comme le dit la mise à jour de OP, il existe différentes manières d’installer Python, qui localisent les fichiers à des emplacements différents. Par exemple, macports insère des éléments dans /opt/local/, tandis que homebrew place les choses dans /usr/local/. De plus, Mac OS X apporte quelques python versions avec lui-même. Donc, si vous installez python plusieurs fois de différentes façons, vous allez récupère plusieurs python existantes indépendamment sur votre système.

Quel problème cela cause-t-il?

Je ne sais pas exactement. Je suppose que le problème est que si vous avez plusieurs versions de python, celle qui sera utilisée et où trouver les paquetages sera déterminée par l'ordre des chemins dans votre système PATH et le PYTHONPATH, respectivement. Vous risquez donc de perdre le contrôle de l'emplacement d'installation des modules python. Pensez-y si vous exécutez Sudo python setup.py install installer un module (il trouve python par la racine PATH), puis essaye de import le module par python -c "import it" (cette fois, il trouve python d'après votre PATH), il se peut que quelque chose se passe mal. C'est ma supposition, je ne l'ai pas validée. Mais dans mon cas , quelque chose s'est mal passé.

Comment éviter cela?

Je pense que le principe serait que soit conscient du fait que différents outils et outils installent les choses indépendamment à différents endroits, utilisez-les donc de manière réfléchie .

  • Sauf si vous avez l'intention de le faire, n'installez pas deux fois la même chose de différentes manières. (Si vous avez l'intention de le faire pour Python, vous pouvez essayer de vérifier virtualenv)
  • Gardez un œil sur l’ordre des chemins dans votre PATH et considérez s’il est correct.
  • Lors de l’installation de modules, précisez lequel python (ou pip) est en cours d’exécution et à quel emplacement le module est installé.

Alors, comment ai-je résolu mon propre cas?

Comme cela avait déjà été gâché et semblait très difficile à guérir, j'ai finalement résolu cette question en en réinstallant complètement le système d'exploitation , et j'ai commencé suivre les DOs-and-DONTs ci-dessus. Pour l'installation de l'environnement scientifique avec python (numpy/scipy/matplotlib, qui avait montré des problèmes pour me faire poser cette question)), j'ai trouvé ce tutoriel était extrêmement utile, donc, le problème est enfin résolu.

27
Skyler

Voici ce qui me déroutait et comment je l'ai résolu.

$ which python
/usr/bin/python 

$ which python3
/usr/local/bin/python3

$ ls /usr/local/bin/python
ls: /usr/local/bin/python: No such file or directory

Remarquez donc que je n’avais pas d’installation de python2.7 sur HomeBrew, mais que j’avais l’installation de python3. La version sous/usr/bin/python utilise la valeur par défaut du système. Vous pouvez dire en fonction du chemin de recherche du module:

$ /usr/bin/python
Python 2.7.10 (default, Feb  7 2017, 00:08:15) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
`enter code here`Type "help", "copyright", "credits" or "license" for 
more information.
>>> import sys
>>> sys.path
['', '/Library/Python/2.7/...

Notez le '/ Library/Python' ... qui est la version de Mac OS de python. Mais je veux rester strictement sur une version installée par l'utilisateur (c'est-à-dire HomeBrew).

Alors voici ce que j'ai fait pour résoudre ce problème:

$ brew install python
...
Warning: python 2.7.13 is already installed, it's just not linked.
You can use `brew link python` to link this version.

$ brew link --overwrite python

$ which python
/usr/local/bin/python

$ python
Python 2.7.10 (default, Feb  7 2017, 00:08:15) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/Cellar/python/2.7.13...

Ce n'est plus/Library/.. mais/usr/local.

Maintenant, sa recherche de tous mes modules installés pip! Problème résolu!


PDATE:

Après la mise à jour de brew vers la version 1.5.4, il semble que les liens symboliques aient été supprimés. Et maintenant, vous devez ajouter ceci à votre chemin:

export PATH="/usr/local/opt/python/libexec/bin:$PATH"

Lisez la section Avertissements dans 'brasser les infos python':

==> Caveats
This formula installs a python2 executable to /usr/local/bin.
If you wish to have this formula's python executable in your PATH then add
the following to ~/.bash_profile:
  export PATH="/usr/local/opt/python/libexec/bin:$PATH"

Pip and setuptools have been installed. To update them
  pip2 install --upgrade pip setuptools

You can install Python packages with
  pip2 install <package>

They will install into the site-package directory
  /usr/local/lib/python2.7/site-packages

See: https://docs.brew.sh/Homebrew-and-Python.html
12
jersey bean

Afin d’installer une python dans un dossier spécifique, vous pouvez utiliser le fichier --prefix schéma pendant python. À l’aide du schéma de préfixe , vous pouvez par exemple installer Python 2.7 dans le dossier /opt/py27. Maintenant, pour utiliser la nouvelle distribution Python installée), vous devez: nettoyer vous [~ # ~] chemin [~ # ~] et LD_LIBRARY_PATH :

  • Supprimer tous les 'anciens' Python chemins et
  • configurez (selon mon exemple) les variables d'environnement comme ceci:
    • CHEMIN: Ajouter/opt/py27/bin
    • LD_LIBRARY_PATH: Ajouter/opt/py27/lib

C'est ça.

(Au cas où vous auriez besoin de plusieurs environnements de Python installé en même temps, je suggérerais de jeter un oeil à virtualenv ) =

8
gecco

Voici une autre excellente solution pour gérer différentes versions de python:

https://github.com/pyenv/pyenv

(J'ai déjà fourni une réponse ici, mais j'ai décidé de l'afficher comme réponse supplémentaire ou alternative)

1
jersey bean