ImportError: no module named-Python

Mam aplikację Pythona o następującej strukturze katalogów:

src
 |
 +---- main
 |
 +---- util
 |
 +---- gen_py
         |
         +---- lib

W pakiecie main mam moduł Pythona o nazwie MyServer.py, który ma instrukcję importu jak:

from gen_py.lib import MyService

Aby to stwierdzenie zadziałało, umieściłem następujący wiersz na początku MyServer.py :

import sys
sys.path.append('../gen_py/lib')

Kiedy uciekam MyServer.py w terminalu pojawia się następujący błąd:

ImportError: no module named gen_py.lib

Co mi tu umyka?
Author: Prashant Kumar, 2011-09-28

6 answers

Twoja modyfikacja sys.path zakłada, że bieżący katalog roboczy jest zawsze w main/. Tak nie jest. Zamiast tego po prostu dodaj Katalog nadrzędny do sys.path:

import sys
import os.path

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import gen_py.lib

Nie zapomnij dołączyć pliku __init__.py do gen_py i lib - w przeciwnym razie nie będą one rozpoznawane jako moduły Pythona.

 72
Author: phihag,
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
2014-01-29 14:07:34

Aby import modułu Pythona działał, musisz mieć "src "w ścieżce, a nie"gen_py/lib".

Podczas przetwarzania importu jak import gen_py.lib, szuka modułu gen_py, a następnie szuka podmodułu lib.

Ponieważ moduł gen_py nie będzie w "../ gen_py / lib "(będzie w".."), dodana ścieżka nie pomoże w procesie importu.

W zależności od tego, skąd go uruchamiasz, spróbuj dodać ścieżkę względną do folderu "src". Być może to sys.path.append('..'). Możesz też mieć pomyślne uruchomienie skryptu w folderze src bezpośrednio, poprzez ścieżki względne, takie jak python main/MyServer.py

 6
Author: lunixbochs,
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
2011-09-28 18:04:09
from ..gen_py.lib import MyService

Lub

from main.gen_py.lib import MyService

Upewnij się, że masz (przynajmniej pusty) __init__.py plik w każdym katalogu.

 5
Author: JBernardo,
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
2011-09-28 18:06:46

Upewnij się, że dołączasz __init__.py, co sprawia, że Python wie, że te katalogi zawierają pakiety

 3
Author: aychen0110,
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
2014-07-22 01:44:56

Jest to sytuacja, gdy budujesz pakiet i znajdujesz błąd w imporcie. Nauczyłem się tego na własnej skórze.Odpowiedzią nie jest dodanie pakietu do ścieżki Pythona ani zrobienie tego programowo (co jeśli twój moduł zostanie zainstalowany i twoje polecenie doda go ponownie? to zły sposób.

The right thing to do is: 1) Użyj virtualenv pyvenv-3.4 lub czegoś podobnego 2) aktywuj tryb deweloperski- $ python setup.py rozwiń

 3
Author: harishkashyap,
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
2015-10-09 16:18:09

Upewnij się, że katalog projektu root pojawia się w sys.wyjście ścieżki. Jeśli nie, Dodaj ścieżkę katalogu głównego projektu do sys./ align = "left" /

 0
Author: Raghav salotra,
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-05-08 07:47:24