2010-02-24 9 views
77

Jaki jest poprawny sposób naprawienia tego błędu ImportError?Jak naprawić błąd "ImportError: No module named ..." w Pythonie?

Mam następującą strukturę katalogów:

/home/bodacydo 
/home/bodacydo/work 
/home/bodacydo/work/project 
/home/bodacydo/work/project/programs 
/home/bodacydo/work/project/foo 

I jestem w katalogu

/home/bodacydo/work/project 

Teraz gdybym wpisać

python ./programs/my_python_program.py 

I natychmiast dostać

ImportError: No module named foo.tasks 

./programs/my_python_program.py zawiera następujący wiersz:

from foo.tasks import my_function 

Nie mogę zrozumieć, dlaczego Python nie znajdzie ./foo/tasks.py - to tam.

Jeśli robię to z powłoki Python, to działa:

python 
>>> from foo.tasks import my_function 

To tylko nie działa, jeśli zgłoszę go za pośrednictwem python ./programs/my_python_program.py skryptu.

Odpowiedz

81

Python nie dodać aktualny katalog sys.path, ale raczej katalog, że skrypt jest w. Dodaj /home/bodacydo/work/project albo sys.path lub $PYTHONPATH.

+1

Więc jaki jest sens posiadania __init__.py w folderze głównym? Wydaje się, że nie ma to żadnego sensu, jeśli edytujesz sys.path lub pythonpath. –

+7

@Editor: '__init __. Py' wskazuje tylko, że katalog powinien być traktowany jako pakiet, gdy jego rodzic jest albo' sys.path' lub sam jest pakietem. –

+1

Ponadto sprawdź uprawnienia do folderu. To był problem w moim przypadku. – SidJ

31

Czy masz plik o nazwie __init__.py w katalogu foo? Jeśli nie, to python nie rozpozna foo jako pakietu python.

Zobacz artykuł section on packages w samouczku Pythona, aby uzyskać więcej informacji.

+0

Dzięki i tak, miałem '__init __. py'. Tym razem problem polegał na '$ PYTHONPATH'. Rozwiązanie Ignacio działało. – bodacydo

+1

Pliki __init__.py są wymagane, aby Python traktował katalogi jako zawierające pakiety; robi się to, aby zapobiec katalogom o wspólnej nazwie, na przykład ciągowi, niezamierzonemu ukrywaniu ważnych modułów, które pojawią się później w ścieżce wyszukiwania modułów. W najprostszym przypadku __init__.py może być pustym plikiem – panofish

+0

Dzięki za uratowanie mnie kiedyś. –

2

W mojej opinii muszę wziąć pod uwagę, że folder foo jest samodzielną biblioteką. Być może warto rozważyć przeniesienie go do folderu Lib\site-packages w instalacji Pythona. Być może warto rozważyć dodanie tam pliku foo.pth.

wiem, że to biblioteka ponieważ ./programs/my_python_program.py zawiera następującą linię:

from foo.tasks import my_function

Więc to nie ma znaczenia, że ​​./programs jest folder rodzeństwo do ./foo. To fakt, że my_python_program.py prowadzony jest jako skrypt jak ten:

python ./programs/my_python_program.py

7

Oto rozwiązanie krok po kroku:

  1. Dodaj skrypt o nazwie run.py w /home/bodacydo/work/project i edytować go tak:

    import programs.my_python_program 
    programs.my_python_program.main() 
    

    (zastąpić main() z równoważną metodą w my_python_program.)

  2. idź do /home/bodacydo/work/project
  3. Run run.py

Objaśnienie: Od pyton dołącza do PYTHONPATH ścieżkę skrypt od którego biegnie, bieganie run.py dołączy /home/bodacydo/work/project. I voilà, import foo.tasks zostanie znaleziony.

7

Przykładowe rozwiązanie do dodawania biblioteki do PYTHONPATH.

  1. Dodaj następujący wiersz do pliku ~/.bashrc lub po prostu uruchomić go bezpośrednio:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
    
  2. Następnie połączyć wymagane biblioteki do katalogu ~/folderu .python, np

    ln -s /home/user/work/project/foo ~/.python/ 
    
0

lepiej fix niż ustawienie PYTHONPATH jest użycie python -m module.path

To będzie prawidłowo ustawić sys.path[0] i jest bardziej niezawodny sposób, aby wykonać modułów.

mam quick writeup temat tego problemu, tak jak inne Główni odpowiadający wspomnieli powód tego jest python path/to/file.py stawia path/to na początku PYTHONPATH (sys.path).

Powiązane problemy