ipython czyta nieprawidłową wersję Pythona

103

Mam problem z Pythonem, iPythonem i bibliotekami. Poniższe punkty pokazują łańcuch problematyki. Używam Pythona 2.7 na Mac Lion.

  1. iPython nie czyta bibliotek scipy, matplotlib, ale czyta numpy.
  2. Aby to naprawić, próbowałem zainstalować wersję kodu źródłowego Pythona i sprawiło mi to tylko więcej problemów, ponieważ teraz mam dwie różne wersje: 2.7.1 i 2.7.2
  3. Zauważyłem, że uruchamianie Pythona używa wersji 2.7.2 i importuje scipy, matplotlib i numpy, ale w iPythonie jest to wersja 2.7.1, która nie otwiera scipy ani matplotlib.

Wypróbowałem kilka rzeczy, które napotkałem na innych blogach. Ale żaden z nich nie pomógł, a także niestety nie bardzo wiem, co z niektórymi robię. Na przykład: próbowałem odinstalować i ponownie zainstalować ipython za pomocą easy_install i pip. Próbowałem również przeinstalować wszystko przez homebrew i zmodyfikować ścieżkę .bash_profile.

Diego-MX
źródło
6
ipythonSkrypt jest „przywiązany” do konkretnej wersji Pythona został zainstalowany z - nie przełączy się automatycznie co zainstalowany jako ostatni. Jeśli najpierw zainstalowałeś 2.7.1, następnie IPython, a następnie 2.7.2 ze źródła, Twój IPython będzie nadal używać 2.7.1. Musisz albo cofnąć wszystkie swoje wymachy, wrócić do oryginalnej wersji Pythona i dowiedzieć się, jaka była przyczyna za punktem 1; alternatywnie, zainstaluj ponownie IPython, używając dowolnej instalacji Pythona, która może uzyskać dostęp do potrzebnych bibliotek.
millimoose
Czy mógłbyś być bardziej konkretny? ... dzięki
Diego-MX
1
Konkretnie o której części? Jak działa uruchamianie IPythona lub jak rozwiązać problem?
millimoose
1
Zasadniczo, po zainstalowaniu dowolnego „programu” w języku Python, takiego jak IPython lub nawet easy_install, skrypt startowy programu jest ustawiony tak, aby zawsze używał pliku wykonywalnego Pythona, z którym został zainstalowany. Tak więc, jeśli miałeś Pythona 2.7.1 bez swoich bibliotek, a następnie zainstalowałeś IPython, IPython jest instalowany „w” instalacji Pythona 2.7.1, a łącze do ipythonpliku wykonywalnego jest umieszczane w PATH. Jeśli następnie zainstalujesz Python 2.7.2 ze źródła, będzie to nowa, oddzielna kopia Pythona, nie zaktualizuje istniejącej wersji 2.7.1, która zawiera IPython. Więc IPython nie zobaczy kopii 2.7.2 ani żadnych zawartych w niej bibliotek.
millimoose
1
Biblioteki działają tak samo. Jeśli zainstalowałeś numpy itp. Po zainstalowaniu Pythona 2.7.2 ze źródła, prawdopodobnie zostały one zainstalowane w katalogu 2.7.2. Oznacza to, że wersja Pythona 2.7.1 w ogóle nie widziałaby tych bibliotek. Ponieważ IPython został zainstalowany wraz z wersją 2.7.1, nie mógł również zobaczyć tych bibliotek. Zasadniczo możesz mieć w swoim systemie dowolną liczbę całkowicie oddzielnych kopii Pythona, ale śledzenie, która z nich jest używana do czego, może być trudne. Jeśli nie wiesz, co robisz, najlepiej zacząć od wbudowanej wersji Pythona i po prostu ponownie zainstalować brakujące biblioteki
millimoose

Odpowiedzi:

147

Dobra szybka naprawa:

which python

daje ci /usr/bin/python, prawda? Robić

which ipython

i założę się, że tak będzie /usr/local/bin/ipython. Zajrzyjmy do środka:

Edycja 07.09.16 - plik wygląda teraz następująco:

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())

I moje działa poprawnie w ten sposób, ale moja sytuacja nie jest dokładnie taka jak w PO.


Oryginalna odpowiedź - 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 - otwórz /usr/local/bin/ipythonw swoim edytorze (z uprawnieniami) i zmień pierwszą linię na

#!/usr/local/bin/python

zapisz, uruchom iPython, powinien powiedzieć, że używa teraz żądanej wersji.

Manuel Ebert
źródło
41
w przypadku wątpliwości python -m IPythonjest równoważne z ipythonoczekiwaniem, że na pewno używasz właściwego języka Python.
Matt
2
pamiętaj też o zamknięciu terminala i otwarciu nowego. ponieważ PATH jest buforowany przez powłokę w celu zwiększenia wydajności. w ten sposób sprawiłem, że to rozwiązanie działa dla mnie. zobacz: conda.pydata.org/docs/…
parsethis
@Matt. Ja też doświadczyłem. Mój przypadek to „python -m IPython” spowoduje wywołanie odpowiedniej wersji, którą chciałem. Ale po prostu „ipython” uruchomił kopię używającą starego pythona2. Tajemnica polega na tym, że jeśli zrobię „który ipython”, wskazuje on na kopię virtualenv z najwyraźniej poprawną zawartością pliku Pythona.
kawingkelvin
15

Publikowanie komentarza @ Matta jako odpowiedzi, aby był bardziej widoczny

python -m IPython

Ładuje ipython jako moduł z dowolnym pythonem, który jest dostępny w ścieżce jako pierwszy. W moim przypadku miałem jeden preinstalowany i jeden dodałem z naparu. To po prostu działa doskonale.

sh87
źródło
Być może nie jest to odpowiedź na to pytanie, ale to jest odpowiedź na pytanie: „jak uruchomić ipythona z zainstalowaną dowolną wersją Pythona”. Dzięki.
Salyangoz
9

A co z korzystaniem z virtualenv? Naprawdę to lubie. Może nie jest to szybszy sposób, ale myślę, że jest to bardzo jasne.

Podczas tworzenia virtualenv możesz określić ścieżkę Pythona za pomocą opcji -p.

dla Pythona 2.7

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

dla Pythona 3.4

$ virtualenv -p /usr/bin/python3.4 venv3.4
$ source venv3.4/bin/activate
(venv3.4)$ pip install ipython
(venv3.4)$ ipython
pvieytes
źródło
2
To stary wątek, ale spotkałem się też z wirtualnymi wersjami i lubię je przy tworzeniu produktów. Jednak dla celów „codziennej” analizy wolałbym mieć w swoim systemie prostą, użytkową wersję języka Python / ipython.
Diego-MX
1
python -m IPythonrozpocznie ipython z podaną wersjąpython
Xiao
1
Zauważ, że python -m IPythontrzeba to zainstalować:pip install ipython
Xiao
6

Po pierwsze, upewnię się, że używasz właściwego Pythona. W wierszu polecenia wpisz:

which python
python -V

Pierwsza poda ścieżkę, a druga podaje wersję Pythona, której używasz.

macduff
źródło
Okej, daje mi to Python 2.7.2 w / usr / local / bin / python
Diego-MX
4

Moje rozwiązanie jest proste, głupie, ale działa.

Używam, python -Vaby upewnić się, jaka jest wersja

$ python -V
Python 2.7.10

a następnie utwórz alias w .bash_profile

$ vi ~/.bash_profile

Dodaj linię

alias ipython="python -m IPython"

wtedy otrzymasz ipythonw Pythonie 2.7. 🙂

(Nawiasem mówiąc, my ipythonis install via homebrew, domyślnie będzie działał ipython w Pythonie 3.)

$ brew install ipython
Jasio
źródło
2

niezwykle trafne: http://conda.pydata.org/docs/troubleshooting.html#shell-command-location .

td; lr występują problemy z powodu „mieszania” powłoki i zmiennych ścieżek.

parsethis
źródło
również ogólną dobrą praktyką jest instalacja ipythona w virtualenv. Twój which pythonpowinien wskazywać binarnego virtualenv Pythona.
parsethis
Ugryzła mnie powłoka, nawet po zainstalowaniu ipythona wewnątrz virtualenv. hash -rnaprawił to dla mnie; dzięki!
theY4Kman
1

Podobna metoda z użyciem pyenv

pyenv install 3.4.5
pyenv local 3.4.5
pip install ipython
ipython

Teraz pokaże poprawną wersję Pythona

Python 3.4.5
Avikd
źródło
1

Absolutnie najprostsze rozwiązanie, jakie przychodzi mi do głowy, które nie wymaga majstrowania przy środowiskach, zainstalowanych plikach ani w niczym innym, opiera się na faktach, że

  1. Plik wykonywalny ipythonjest w rzeczywistości skryptem w Pythonie.
  2. Pakiet IPython jest instalowany osobno dla każdego interpretera, z którym został uruchomiony pip intall.

Jeśli wersja Pythona, z którą korzystasz, ma zainstalowany pakiet IPython, możesz to zrobić

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

Spowoduje to uruchomienie ipythonskryptu za pomocą odpowiedniego interpretera zamiast tego wymienionego w shebang.

Szalony Fizyk
źródło
Zamiast wywoływać powyższe za każdym razem, jak ustawić go jako domyślny, aby za każdym razem, gdy piszę ipythonw mojej powłoce, automatycznie czytał niestandardowy interpreter zamiast domyślnego?
Srivatsan
Dodaj skrypt, który to robi, do ścieżki przed domyślną. Ale żeby to zrobić, musisz zadzierać ze środowiskiem.
Mad Physicist,
0

Twój problem polega w zasadzie na tym, aby ipython używał właściwego Pythona.

więc rozwiązaniem problemu jest sprawienie, aby ipython używał odpowiedniego Pythona (który ma zainstalowane biblioteki takie jak scipy)

Tutaj napisałem rozwiązanie:

Jak sprawić, by iPython używał Pythona 2 zamiast Pythona 3

Harish Kayarohanam
źródło
0

Natknąłem się na ten sam problem, ale poniższe było jedynym rozwiązaniem, które działało dla mnie na OSX 12, Sierra.

ipython zawsze był uruchamiany w Pythonie 3.6, ale potrzebowałem go w wersji 2.7. Nie mogłem znaleźć skryptu startowego ipython dla wersji 2.7, ani nie mogłem znaleźć modułu IPython do wykonania python -m. Żaden z brew instally ipython pip install ipythonlub pip2 install ipythonnie mógł mi dostać wersji 2.7. Więc dostałem to ręcznie.

brew install ipython@5instaluje stąd wersję 2.7 , ale nie umieści jej na twoim, $PATHponieważ wie, że nazwa powoduje konflikt z innym pakietem. ln -s /usr/local/Cellar/ipython@5/5.5.0_1/bin/ipython /usr/local/bin/ipython2naprawi to i pozwoli ci po prostu uruchomić ipython2z zachęty powłoki

Dla mnie, ponieważ poważnie podchodziłem do używania ipythona w wersji 2.7, uruchomiłem również następujące polecenia.

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
źródło
0

Wszystkie wymienione tutaj odpowiedzi nie pomagają w rozwiązaniu problemu, jeśli używasz anakondy lub innego opakowania środowiska wirtualnego.

Ta odpowiedź opiera się na założeniu, że używasz anakondy.

Załóżmy, że pracujesz w środowisku Python 3 i podczas tworzenia notatnika w notatniku jupyter wyświetla się „Python 2” zamiast „Python 3”.

Dzieje się tak, ponieważ „ipython” jest w istocie skryptem, który jest uruchamiany iw tym skrypcie wspomina, której wersji języka Python używa do wykonania polecenia. Wszystko, co musisz zrobić, to zmienić tę linię, aby ipython używał żądanej wersji Pythona.

Najpierw zatrzymaj serwer ipython i uzyskaj lokalizację pliku wykonywalnego Pythona w bieżącym środowisku za pomocą polecenia „który python”

Mój wynik to:

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

Teraz pobierz lokalizację wykonywalną ipythona, użyj polecenia „który ipython”

mój jest :

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

Zauważ, że używa innej wersji Pythona, tj. python z określonego środowiska z inną wersją języka python, tj. z uruchomionym językiem Python z innego środowiska.

Teraz przejdź do katalogu anaconda2 / bin (dla użytkowników anaconda 3 powinno to być anaconda3 / bin) i wyszukaj plik „ipython”. w tej edycji pierwsza linia wskazuje na aktualną wersję Pythona, którą chcesz. tj. wyjście polecenia „który python”, czyli:

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

Zauważ, że zmieniłem moje środowisko Pythona z py2 (z uruchomionym Pythonem 2.7) na py3 (z Pythonem 3.5).

Zapisz plik. I uruchom notatnik jupyter, teraz podczas tworzenia nowego notatnika opcja „Python 3” powinna być widoczna.

Twoje zdrowie!

100rabh
źródło