Próbuję uruchomić skrypt, który uruchamia między innymi skrypt w języku Python. Otrzymuję ImportError: Brak modułu o nazwie ..., jednak jeśli uruchomię ipython i zaimportuję ten sam moduł w ten sam sposób przez interpreter, moduł zostanie zaakceptowany.
Co się dzieje i jak mogę to naprawić? Próbowałem zrozumieć, w jaki sposób python używa PYTHONPATH, ale jestem całkowicie zdezorientowany. Każda pomoc byłaby bardzo mile widziana.
python
ipython
jupyter-notebook
importerror
CodeOcelot
źródło
źródło
-v
opcją, a zobaczysz, gdzie python znajduje (lub nie) znajduje moduły, które importujesz.Odpowiedzi:
Ten problem wynika ze sposobu, w jaki interpreter IPython w wierszu poleceń używa bieżącej ścieżki w porównaniu ze sposobem, w jaki działa oddzielny proces (czy to notatnik IPython, proces zewnętrzny itp.). IPython będzie szukał modułów do zaimportowania, które znajdują się nie tylko w sys.path, ale także w bieżącym katalogu roboczym. Kiedy uruchamiasz interpreter z wiersza poleceń, bieżący katalog, w którym pracujesz, jest tym samym, w którym uruchomiłeś ipython. Jeśli uruchomisz
zobaczysz, że to prawda.
Załóżmy jednak, że używasz notatnika ipython, uruchom,
os.getcwd()
a Twoim bieżącym katalogiem roboczym jest folder, w którym kazałeś działać notebookowi w pliku ipython_notebook_config.py (zwykle przy użyciu tegoc.NotebookManager.notebook_dir
ustawienia).Rozwiązaniem jest dostarczenie interpreterowi Pythona ścieżki do twojego modułu. Najprostszym rozwiązaniem jest dodanie tej ścieżki do listy sys.path. W swoim notatniku najpierw spróbuj:
Jeśli to nie zadziała, masz inny problem niezwiązany ze ścieżką do importu i powinieneś podać więcej informacji o swoim problemie.
Lepszym (i trwalszym) sposobem rozwiązania tego problemu jest ustawienie PYTHONPATH , która zapewnia interpreterowi dodatkowe katalogi wyszukujące pakiety / moduły Pythona. Edytowanie lub ustawianie PYTHONPATH jako zmiennej globalnej zależy od systemu operacyjnego i jest szczegółowo omówione tutaj dla systemów Unix lub Windows .
źródło
__init_.py
, prawda? ... i nie zamierzam zmieniaćPYTHONPATH
ani dzwonićsys.path.append
, nawet jeśli są również poprawne (prawda?). Mam na myśli dziesiątki katalogów z kodem w nich i nie zamierzam dodawać ich wszystkich do ścieżki - ani nie oczekuję, że inni użytkownicy do ich pliku konfiguracyjnego jupyter, nawet jeśli jest to jeden katalog.Po prostu utwórz pusty plik Pythona z nazwą
__init__.py
pod folderem, który wyświetla błąd podczas uruchamiania projektu w języku Python.źródło
foo.ipynb
używającbar/baz.py
, dodaj pustybar/__init__.py
plik, aby notebook mógł używaćfrom bar.baz import MyClass
Upewnij się, że oboje używają tego samego tłumacza. Zdarzyło mi się to na Ubuntu:
I
sys.path
było inaczej między dwoma tłumaczami. Aby to naprawić, usunąłem Pythona 3.3.źródło
pip install --upgrade ipython
aby pobrać najnowszą wersję, a następnie automatycznie używała domyślnie 2.7.11.import sys; sys.version
Głównym powodem jest to, że sys.paths w Pythonie i IPythonie są różne.
Proszę odnieść się do linku lucypark , rozwiązanie działa w moim przypadku. Dzieje się tak, gdy instalujesz opencv przez
conda install opencv
I dostałem błąd importu w iPythonie, istnieją trzy kroki, aby rozwiązać ten problem:
1. Sprawdź ścieżkę w Pythonie i iPythonie za pomocą następującego polecenia
Znajdziesz inne wyniki z Pythona i Jupytera. Drugi krok, po prostu użyj,
sys.path.append
aby naprawić pominiętą ścieżkę przez try-and-error.2. Rozwiązanie tymczasowe
W iPythonie:
ImportError:..
problem rozwiązany3. Trwałe rozwiązanie
Utwórz profil iPython i ustaw początkowe dołączanie:
W powłoce bash:
W vi, dołącz do pliku:
GOTOWE
źródło
Robi
sys.path.append('my-path-to-module-folder')
będzie działać, ale aby uniknąć konieczności zrobić w ipython każdym razem chcesz użyć modułu, można dodaćexport PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
do~/.bash_profile
pliku.źródło
Przed zainstalowaniem ipythona zainstalowałem moduły przez easy_install; powiedz
sudo easy_install mechanize
.Po zainstalowaniu ipythona musiałem ponownie uruchomić easy_install, aby ipython rozpoznał moduły.
źródło
Miałem podobny problem, naprawiłem go, wywołując
python3
zamiastpython
, moje moduły były w Pythonie 3.5.źródło
Jeśli uruchamiasz go z wiersza poleceń, czasami interpreter Pythona nie jest świadomy ścieżki, w której należy szukać modułów.
Poniżej znajduje się struktura katalogów mojego projektu:
Biegałem pod poleceniem:
Po uruchomieniu powyższego polecenia otrzymałem poniższy błąd
lib został zaimportowany do my_test.py
Wydrukowałem sys.path i zorientowałem się, że ścieżka projektu, nad którym pracuję, nie jest dostępna na liście sys.path
Dodałem poniższy kod na początku mojego skryptu
my_test.py
.Nie jestem pewien, czy to dobry sposób na rozwiązanie tego problemu, ale tak, zadziałał dla mnie.
źródło
os.getcwd()
pobierze katalog, w którym skrypt został uruchomiony, a nie katalog, w którym znajduje się plik skryptu.Oto jak to naprawiłem:
źródło
Odkryłem, że rozwiązanie tego problemu zostało obszernie udokumentowane tutaj:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
Zasadniczo musisz zainstalować pakiety w środowisku Jupyter, wydając polecenia powłoki, takie jak:
Proszę sprawdzić powyższy link, aby uzyskać miarodajną pełną odpowiedź.
źródło
Znalazłem jeszcze jedno źródło tej rozbieżności:
Zainstalowałem ipythona zarówno lokalnie, jak i powszechnie w virtualenvach. Mój problem polegał na tym, że w nowo utworzonym virtualenvie z ipythonem odebrano system ipython, który był inną wersją niż python i ipython w virtualenv (a 2.7.x vs. 3.5.x) i nastąpiła wesołość.
Myślę, że mądrą rzeczą do zrobienia podczas instalowania czegoś, co będzie zawierało plik binarny,
yourvirtualenv/bin
jest natychmiastowe uruchomienierehash
lub coś podobnego dla dowolnej używanej powłoki, aby wybrać poprawny Python / ipython. (Muszę sprawdzić, czy są odpowiedniepip
haki po instalacji ...)źródło
Rozwiązanie bez skryptów:
źródło
Jest to prawdopodobnie spowodowane różnymi wersjami Pythona zainstalowanymi w twoim systemie , np. Python2 lub python3 .
Uruchom polecenie
$ pip --version
i$ pip3 --version
sprawdź, z którego pip pochodzi Python 3x . Np. Powinieneś zobaczyć informacje o wersji, jak poniżej:Następnie uruchom
example.py
skrypt za pomocą poniższego poleceniaźródło
Przydarzyło mi się z katalogiem
utils
. Próbowałem zaimportować ten katalog jako:utils
jest już pakietem w Pythonie. Po prostu zmień nazwę katalogu na inną i powinno działać dobrze.źródło
Ten rodzaj błędów występuje najprawdopodobniej z powodu konfliktów wersji Pythona. Na przykład, jeśli twoja aplikacja działa tylko na Pythonie 3 i masz również Pythona 2, lepiej jest określić, której wersji użyć. Na przykład użyj
zamiast
źródło
Ta odpowiedź dotyczy tego pytania, jeśli
Tymczasowo zmodyfikuj PYTHONPATH
ścieżka poniżej może być względna
źródło
import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') import ta
źródło
Usuń
pathlib
i zainstaluj ponownie. Usuń pathlib wsitepackages
folderze i ponownie zainstaluj pakiet pathlib za pomocą polecenia pip:źródło