Uruchamianie programu Jupyter z wieloma ścieżkami Pythona i Ipythona

Chciałbym pracować z notebookami Jupyter, ale miałem problemy z importem podstawowych plików (takich jak import matplotlib). Myślę, że to dlatego, że mam kilka zarządzanych przez użytkownika instalacji Pythona. Na przykład:

> which -a python
/usr/bin/python
/usr/local/bin/python

> which -a ipython
/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
/usr/local/bin/ipython

> which -a jupyter
/Library/Frameworks/Python.framework/Versions/3.5/bin/jupyter
/usr/local/bin/jupyter

Kiedyś miałem anacondę, ale usunąłem if z katalogu ~ / anaconda. Teraz, kiedy uruchamiam Notatnik Jupyter, dostaję błąd Jądra:

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌n3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌n3.5/subprocess.py",
line 1551, in _execute_child raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2]
No such file or directory: '/Users/npr1/anaconda/envs/py27/bin/python' 
Co mam zrobić?!
Author: Matt, 2016-08-18

1 answers

Jest to dość proste do naprawienia, ale wymaga zrozumienia trzech różnych pojęć:]}

  1. jak Unix / Linux / OSX używa $PATH do znajdowania plików wykonywalnych (%PATH% w systemie Windows)
  2. jak Python instaluje i znajduje Pakiety
  3. skąd Jupyter wie, jakiego Pythona użyć

Ze względu na kompletność, postaram się zrobić szybki ELI5 na każdym z nich, abyś wiedział, jak rozwiązać ten problem w najlepszy dla Ciebie sposób.

1. Unix / Linux / OSX $PATH

Po wpisaniu dowolnego polecenia w wierszu polecenia (powiedzmy python), system ma dobrze zdefiniowaną sekwencję miejsc, w których szuka pliku wykonywalnego. Sekwencja ta jest zdefiniowana w zmiennej systemowej o nazwie PATH, którą użytkownik może określić. Aby zobaczyć PATH, możesz wpisać echo $PATH.

Wynikiem jest lista katalogów na twoim komputerze, które będą przeszukiwane w kolejności dla żądanego pliku wykonywalnego. Z powyższego wyjścia zakładam, że zawiera ono:

$ echo $PATH
/usr/bin/:/Library/Frameworks/Python.framework/Versions/3.5/bin/:/usr/local/bin/

W windows echo %path%

Prawdopodobnie przeplatają się też inne ścieżki. Oznacza to, że po wpisaniu python, system przejdzie do /usr/bin/python. Gdy wpiszesz ipython, w tym przykładzie system przejdzie do /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython, ponieważ w /usr/bin/ nie ma ipython.

Zawsze ważne jest, aby wiedzieć, jakiego programu wykonywalnego używasz, szczególnie, gdy masz tak wiele instalacji tego samego programu w systemie. Zmiana ścieżki nie jest zbyt skomplikowana; patrz np. jak na stałe ustawić $PATH na Linuksie?.

Windows - Jak ustawić zmienne środowiskowe w Windows 10

2. Jak Python znajduje Pakiety

Kiedy uruchamiasz Pythona i robisz coś podobnego import matplotlib, Python musi zagrać w podobną grę, aby znaleźć pakiet, który masz na myśli. Podobnie jak $PATH W Unixie, Python ma sys.path, który określa te:

$ python
>>> import sys
>>> sys.path
['',
 '/Users/jakevdp/anaconda/lib/python3.5', 
 '/Users/jakevdp/anaconda/lib/python3.5/site-packages',
 ...]

Kilka ważnych rzeczy: domyślnie pierwszy wpis w sys.path jest bieżącym katalogiem. Również, chyba że modyfikujesz to (czego nie powinieneś robić, jeśli nie wiesz dokładnie, co robisz) Zwykle znajdziesz coś o nazwie site-packages w ścieżce: jest to domyślne miejsce, w którym Python umieszcza Pakiety, gdy instalujesz je za pomocą python setup.py install, pip, lub conda, lub podobnych środków.

Ważną rzeczą jest to, że każda instalacja Pythona ma swoje własne pakiety site-packages , gdzie pakiety są instalowane dla tej konkretnej wersji Pythona . Innymi słowy, jeśli zainstalujesz coś dla, np. /usr/bin/python, wtedy ~/anaconda/bin/python nie można użyć tego pakietu , ponieważ został on zainstalowany na innym Pythonie! Dlatego w naszej giełdzie na Twitterze polecam skupić się na jednej instalacji Pythona i naprawić $PATH tak, że używasz tylko tego, którego chcesz użyć.

Jest jeszcze jeden komponent: niektóre pakiety Pythona są dołączone do samodzielnych skryptów, które można uruchamiać z linii poleceń (przykłady to pip, ipython, jupyter, pep8, itd.) Domyślnie te pliki wykonywalne zostaną umieszczone w tej samej ścieżce katalogów, co Python użyty do ich instalacji, i są zaprojektowane do pracy tylko z tą instalacją Pythona .

Oznacza to, że gdy Twój system jest skonfigurowany, po uruchomieniu python otrzymujesz /usr/bin/python, ale gdy uruchomisz ipython, otrzymujesz /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython, która jest powiązana z wersją Pythona na /Library/Frameworks/Python.framework/Versions/3.5/bin/python! Co więcej, oznacza to, że pakiety, które można importować po uruchomieniu python, są całkowicie oddzielone od pakietów, które można importować po uruchomieniu ipython lub Jupyter notebook: używasz dwóch całkowicie niezależnych instalacji Pythona.

Jak to naprawić? Najpierw upewnij się, że Twoja zmienna $PATH robi to, co chcesz. Prawdopodobnie masz skrypt startowy o nazwie coś w rodzaju ~/.bash_profile lub ~/.bashrc, który ustawia tę zmienną $PATH. W systemie Windows można modyfikować zmienne środowiskowe specyficzne dla użytkownika. Możesz to ręcznie zmodyfikować, jeśli chcesz, aby Twój system wyszukiwał rzeczy w innej kolejności. Przy pierwszej instalacji anaconda / miniconda, tam będzie to opcja, aby zrobić to automatycznie( dodaj Pythona do ścieżki): Powiedz TAK, a następnie python zawsze wskaże ~/anaconda/python, co prawdopodobnie jest tym, czego chcesz.

3. Jak Jupyter wie, czego używać w Pythonie

Jeszcze nie wyszliśmy z wody. Wspomniałeś, że w notatniku Jupyter pojawia się błąd jądra: oznacza to, że Jupyter szuka nieistniejącej wersji Pythona.

Jupyter jest skonfigurowany tak, aby móc korzystać z szerokiej gamy "jąder", lub silniki wykonawcze dla kodu. Mogą to być Python 2, Python 3, R, Julia, Ruby... istnieje dziesiątki możliwych jąder do użycia. Aby jednak tak się stało, Jupyter musi wiedzieć , gdzie , aby szukać powiązanego pliku wykonywalnego: to znaczy musi wiedzieć, w której ścieżce znajduje się python.

Ścieżki te są określone w jupyter ' s kernelspec, a użytkownik może dostosować je do swoich pragnień. Na przykład, oto lista jąder, które mam na moim system:
$ jupyter kernelspec list
Available kernels:
  python2.7        /Users/jakevdp/.ipython/kernels/python2.7
  python3.3        /Users/jakevdp/.ipython/kernels/python3.3
  python3.4        /Users/jakevdp/.ipython/kernels/python3.4
  python3.5        /Users/jakevdp/.ipython/kernels/python3.5
  python2          /Users/jakevdp/Library/Jupyter/kernels/python2
  python3          /Users/jakevdp/Library/Jupyter/kernels/python3

Każdy z nich jest katalogiem zawierającym pewne metadane, które określają nazwę jądra, ścieżkę do pliku wykonywalnego i inne istotne informacje.
Jądra można dostosować ręcznie, edytując metadane wewnątrz katalogów wymienionych powyżej.

Polecenie instalacji jądra może się zmieniać w zależności od jądra. IPython opiera się na pakiecie ipykernel , który zawiera polecenie instalacji jądra Pythona: na przykład

$  python -m ipykernel install

Stworzy kernelspec powiązany z programem wykonywalnym Pythona, którego używasz do uruchomienia tego polecenia. Następnie możesz wybrać to jądro w notatniku Jupyter, aby uruchomić kod z tym Pythonem.

Możesz zobaczyć inne opcje, które oferuje ipykernel za pomocą polecenia help:

$ python -m ipykernel install --help
usage: ipython-kernel-install [-h] [--user] [--name NAME]
                              [--display-name DISPLAY_NAME] [--prefix PREFIX]
                              [--sys-prefix]

Install the IPython kernel spec.

optional arguments:
  -h, --help            show this help message and exit
  --user                Install for the current user instead of system-wide
  --name NAME           Specify a name for the kernelspec. This is needed to
                        have multiple IPython kernels at the same time.
  --display-name DISPLAY_NAME
                        Specify the display name for the kernelspec. This is
                        helpful when you have multiple IPython kernels.
  --prefix PREFIX       Specify an install prefix for the kernelspec. This is
                        needed to install into a non-default location, such as
                        a conda/virtual-env.
  --sys-prefix          Install to Python's sys.prefix. Shorthand for
                        --prefix='/Users/bussonniermatthias/anaconda'. For use
                        in conda/virtual-envs.

Uwaga: najnowsza wersja anaconda jest dostarczana z rozszerzeniem dla notebooka, które powinno automatycznie wykrywać różne środowiska conda, jeśli zainstalowany jest w nim pakiet ipykernel.

Podsumowanie: Naprawienie problemu

Więc z tym tłem, twój problem jest dość łatwy do naprawienia:]}
  1. Ustaw PATH tak, aby żądana wersja Pythona była pierwsza. Na przykład, możesz uruchomić export PATH="/path/to/python/bin:$PATH", aby określić (jeden raz), którego Pythona chcesz użyć. Aby to zrobić na stałe, dodaj tę linię do swojego .bash_profile/.bashrc (zauważ, że anaconda może to zrobić automatycznie po zainstalowaniu). Polecam korzystanie z Pythona, który pochodzi z anaconda lub miniconda: to pozwoli ci na conda install wszystkie narzędzia, których potrzebujesz.

  2. Upewnij się, że pakiety, których chcesz użyć, są zainstalowane dla Pythona. Jeśli używasz conda, możesz wpisać np. conda install jupyter matplotlib scikit-learn, aby zainstalować te pakiety dla anaconda/bin/python.

  3. Upewnij się, że twoje jądra Jupyter wskazują wersje Pythona, których chcesz użyć. Kiedy conda install jupyter powinien ustawić to dla anaconda/bin/python automatycznie. W przeciwnym razie możesz użyć polecenia jupyter kernelspec lub python -m ipykernel install, aby dostosować istniejące jądra lub zainstalować nowe.

  4. Aby zainstalować moduły w innych jądrach Pythona Jupyter nie zarządzanych przez Anacondę, należy skopiować ścieżkę do pliku wykonywalnego Pythona dla jądra i uruchomić /path/to/python -m pip install <package>

Mam nadzieję, że to jasne... powodzenia!
 101
Author: jakevdp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-12 20:32:57