ipython lit une mauvaise version de python

103

J'ai eu des problèmes avec Python, iPython et les bibliothèques. Les points suivants montrent l'enchaînement des problématiques. J'exécute Python 2.7 sur Mac Lion.

  1. iPython ne lit pas les bibliothèques de scipy, matplotlib, mais il lit numpy.
  2. Pour résoudre ce problème, j'ai essayé d'installer la version du code source de Python, et cela ne m'a posé que plus de problèmes puisque maintenant j'ai deux versions différentes: 2.7.1 et 2.7.2
  3. J'ai remarqué que l'exécution de Python utilise la version 2.7.2 et importe scipy, matplotlib et numpy, mais sur iPython, la version est 2.7.1 qui n'ouvre pas scipy ou matplotlib.

J'ai essayé plusieurs choses que j'ai rencontrées sur d'autres articles de blog. Mais aucun d'entre eux n'a aidé, et malheureusement je ne sais pas trop ce que je fais avec certains d'entre eux. Par exemple: j'ai essayé de désinstaller et de réinstaller ipython avec easy_install et pip. J'ai également essayé de tout réinstaller via homebrew et de modifier le chemin .bash_profile.

Diego-MX
la source
6
Le ipythonscript est "lié" à la version spécifique de Python avec laquelle il a été installé - il ne passera pas automatiquement à ce que vous avez installé en dernier. Si vous avez d'abord installé 2.7.1, puis IPython, puis 2.7.2 à partir de la source, votre IPython continuera à utiliser 2.7.1. Vous devez soit annuler tout votre flailing, revenir à votre version originale de Python et déterminer la raison du point 1; vous pouvez également réinstaller IPython à l'aide de l'installation Python qui peut accéder aux bibliothèques dont vous avez besoin.
millimoose
Pourriez-vous être plus précis? ... merci
Diego-MX
1
Spécifique sur quelle partie? Comment fonctionne le démarrage d'IPython ou comment résoudre le problème?
millimoose
1
Essentiellement, lorsque vous installez un "programme" python, comme IPython ou même easy_install, le script de démarrage du programme est configuré pour toujours utiliser l'exécutable python avec lequel il a été installé. Donc, si vous aviez Python 2.7.1 sans vos bibliothèques, puis installez IPython, IPython est installé "dans" l'installation de Python 2.7.1, et un lien vers l' ipythonexécutable est placé sur votre PATH. Si vous installez ensuite Python 2.7.2 à partir des sources, il s'agit d'une nouvelle copie distincte de Python, elle ne mettra pas à niveau le 2.7.1 existant qui contient IPython. Ainsi, IPython ne verra pas la copie 2.7.2, ni aucune bibliothèque qu'elle contient.
millimoose
1
Les bibliothèques fonctionnent de la même manière. Si vous avez installé numpy etc. après avoir installé Python 2.7.2 à partir des sources, ils ont probablement été installés dans le répertoire 2.7.2. Cela signifie que la version Python 2.7.1 ne verrait pas du tout ces bibliothèques. Comme IPython a été installé avec 2.7.1, il ne pouvait pas non plus voir ces bibliothèques. Fondamentalement, vous pouvez avoir autant de copies complètement séparées de Python sur votre système que vous le souhaitez, mais il peut être difficile de savoir laquelle est utilisée pour quoi. À moins que vous ne sachiez ce que vous faites, il est préférable de commencer avec la version intégrée de Python et de simplement réinstaller les bibliothèques manquantes
millimoose

Réponses:

147

Correctif rapide correct:

which python

vous donne /usr/bin/python, non? Faire

which ipython

et je parie que ce sera le cas /usr/local/bin/ipython. Regardons à l'intérieur:

Edit 9/7/16 - Le fichier ressemble maintenant à ceci:

cat /usr/local/bin/ipython

#!/usr/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

Et le mien fonctionne correctement comme ça, mais ma situation n'est pas exactement celle de l'OP.


Réponse originale - 30/09/13:

cat /usr/local/bin/ipython

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'ipython==0.12.1','console_scripts','ipython'
__requires__ = 'ipython==0.12.1'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('ipython==0.12.1', 'console_scripts', 'ipython')()
    )

Aha - ouvrez /usr/local/bin/ipythondans votre éditeur (avec privilèges) et changez la première ligne en

#!/usr/local/bin/python

enregistrez, démarrez iPython, devrait dire qu'il utilise la version que vous voulez maintenant.

Manuel Ebert
la source
41
dans le doute, python -m IPythonéquivaut à ipython, attendez-vous à ce que vous soyez sûr d'utiliser le bon Python.
Matt
2
n'oubliez pas de fermer le terminal et d'en ouvrir un nouveau. puisque le PATH est mis en cache par le shell pour plus d'efficacité. c'est ainsi que j'ai fait fonctionner cette solution pour moi. voir: conda.pydata.org/docs/…
parsethis
@Mat. J'ai aussi expérimenté. Mon cas est "python -m IPython" invoquera la bonne version que je voulais. Mais juste 'ipython', il a commencé une copie qui utilise l'ancien python2. Le mystère est que si je fais un "quel ipython", il pointe vers une copie virtualenv avec ce contenu de fichier python apparemment correct.
kawingkelvin
15

Publier le commentaire de @ Matt comme réponse pour qu'il soit plus visible

python -m IPython

Charge ipython en tant que module avec tout python accessible sur le chemin en premier. Dans mon cas, j'en avais un pré-installé et un ajouté à partir de la bière. Cela fonctionne parfaitement.

sh87
la source
Peut-être pas la réponse à cette question, mais c'est la réponse à la question: "comment exécuter ipython avec n'importe quelle version de python installée". Merci.
Salyangoz
9

Qu'en est-il de l'utilisation d'un virtualenv? J'aime vraiment ça. Ce n'est peut-être pas le moyen le plus rapide, mais je pense que c'est très clair.

Lorsque vous créez un virtualenv, vous pouvez spécifier le chemin python avec l'indicateur -p.

pour python 2.7

$ virtualenv -p /usr/bin/python2.7 venv2.7
$ source venv2.7/bin/activate
(venv2.7)$ pip install ipython
(venv2.7)$ ipython

pour python 3.4

$ virtualenv -p /usr/bin/python3.4 venv3.4
$ source venv3.4/bin/activate
(venv3.4)$ pip install ipython
(venv3.4)$ ipython
pvieytes
la source
2
C'est un vieux fil de discussion, mais je suis également tombé sur des virtualenvs et je les aime bien pour développer des produits. Pour les besoins de l'analyse «quotidienne» cependant, je préfère simplement avoir une version directement utilisable de python / ipython dans mon système.
Diego-MX
1
python -m IPythondémarrera ipython avec la version donnée depython
Xiao
1
Notez que python -m IPythonbesoin de ceci installé:pip install ipython
Xiao
6

Tout d'abord, je m'assurerais que vous utilisez le bon python. À une invite de commande, tapez:

which python
python -V

Le premier vous indiquera le chemin, le second vous indiquera la version de Python que vous utilisez.

macduff
la source
D'accord, ça me donne Python 2.7.2 sur / usr / local / bin / python
Diego-MX
4

Ma solution est simple, stupide mais fonctionne.

J'utilise python -Vpour m'assurer de la version

$ python -V
Python 2.7.10

puis créez un alias dans .bash_profile

$ vi ~/.bash_profile

Ajouter une ligne

alias ipython="python -m IPython"

alors vous obtiendrez un ipythonen python 2.7. 🙂

(Au fait, mon ipythonest installé via homebrew, il aura par défaut un ipython exécuté en python 3.)

$ brew install ipython
Johnny
la source
2

extrêmement pertinent: http://conda.pydata.org/docs/troubleshooting.html#shell-command-location .

td; lr des problèmes sont rencontrés à cause du «hachage» du shell et des variables de chemin.

parsethis
la source
une bonne pratique générale consiste également à installer ipython dans virtualenv. votrewhich python pointer vers le binaire python virtualenv.
parsethis le
Le hachage du shell m'a mordu, même après avoir installé ipython dans virtualenv. hash -rréparé pour moi; Merci!
theY4Kman
1

Une méthode similaire utilisant pyenv

pyenv install 3.4.5
pyenv local 3.4.5
pip install ipython
ipython

Maintenant, il affichera la version correcte de python

Python 3.4.5
Avikd
la source
1

La solution la plus simple à laquelle je puisse penser, qui ne nécessite pas de manipuler les environnements, les fichiers installés ou quoi que ce soit d'autre, repose sur les faits que

  1. L'exécutable ipythonest en fait un script Python.
  2. Le package IPython est installé séparément pour chaque interpréteur avec lequel vous avez exécuté pip intall.

Si la version de Python avec laquelle vous exécutez a un package IPython installé, vous pouvez simplement faire

/path/to/desired/python $(which ipython)

Cela exécutera le ipythonscript avec l'interpréteur de votre choix au lieu de celui répertorié dans le shebang.

Physicien fou
la source
Au lieu d'appeler ce qui précède à chaque fois, comment le définir par défaut, de sorte que chaque fois que je tape ipythondans mon shell, il lit automatiquement l'interpréteur personnalisé au lieu de l'interpréteur par défaut?
Srivatsan le
Ajoutez un script qui fait cela au chemin avant la valeur par défaut. Mais vous devez jouer avec l'environnement pour faire cela.
Mad Physicist le
0

Je suis tombé sur le même problème, mais ce qui suit était la seule solution qui fonctionnait pour moi sur OSX 12, Sierra.

ipython se lancait toujours pour python 3.6 mais j'en avais besoin pour 2.7. Je n'ai pas pu trouver de script de démarrage ipython pour 2.7, ni le module IPython avec lequel exécuter python -m. Aucun brew instally ipython pip install ipythonou pip2 install ipythonn'a pu me procurer la version 2.7. Alors je l'ai eu manuellement.

brew install ipython@5installe la version 2.7 à partir d' ici mais ne la mettra pas sur votre $PATHcar il sait que le nom est en conflit avec un autre paquet. ln -s /usr/local/Cellar/ipython@5/5.5.0_1/bin/ipython /usr/local/bin/ipython2corrigera cela et vous permettra de simplement exécuter à ipython2partir de votre invite de shell

Pour moi, parce que je voulais vraiment utiliser ipython pour 2.7, j'ai également exécuté les commandes suivantes.

ln -s /usr/local/Cellar/ipython/6.2.1/bin/ipython /usr/local/bin/ipython3
rm -f /usr/local/bin/ipython
ln -s /usr/local/bin/ipython2 /usr/local/bin/ipython
Jeremy Paige
la source
0

Toutes les réponses mentionnées ici n'aident pas à résoudre le problème si vous utilisez anaconda ou un autre wrapper d'environnement virtuel.

Cette réponse est basée sur l'hypothèse que vous utilisez anaconda.

Supposons que vous soyez dans un environnement python 3 et que lors de la création d'un notebook sur jupyter notebook, il affiche "Python 2" au lieu de "Python 3".

C'est parce que "ipython" est essentiellement un script qui est exécuté et dans ce script, il mentionne la version de Python qu'il utilise pour exécuter la commande. Tout ce que vous avez à faire est de changer cette ligne pour qu'ipython utilise la version de python souhaitée.

Arrêtez d'abord le serveur ipython et récupérez l'emplacement de l'exécutable python de l'environnement actuel en utilisant la commande "which python"

Ma sortie est:

/home/sourabh/anaconda2/envs/py3/bin/python

Maintenant, récupérez l'emplacement de l'exécutable d'ipython, utilisez la commande "which ipython"

le mien est :

/home/sourabh/anaconda2/envs/py2/bin/python

Notez qu'il utilise une version différente de python ie. python à partir d'un environnement spécifique exécutant une version différente de python, c'est-à-dire exécutant python à partir d'un environnement différent.

Naviguez maintenant vers le répertoire anaconda2 / bin (pour les utilisateurs d'anaconda 3, il devrait être anaconda3 / bin) et recherchez le fichier "ipython". dans cette modification, la première ligne doit pointer vers la version actuelle de python souhaitée. ie la sortie de "quel python" ie:

#!/home/sourabh/anaconda2/envs/py3/bin/python

Notez que j'ai changé mon environnement python de py2 (exécutant python 2.7) à py3 (exécutant python 3.5).

Enregistrez le fichier. Et lancez jupyter notebook, maintenant lors de la création d'un nouveau notebook, l'option "Python 3" devrait être visible.

À votre santé!

100rabh
la source