Błąd Pythona „ImportError: Brak nazwanego modułu”

452

Python jest zainstalowany w katalogu lokalnym.

Moje drzewo katalogów wygląda następująco:

(local directory)/site-packages/toolkit/interface.py

Mój kod jest tutaj:

(local directory)/site-packages/toolkit/examples/mountain.py

Aby uruchomić przykład, piszę python mountain.py, aw kodzie mam:

from toolkit.interface import interface

I pojawia się błąd:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Już sprawdziłem sys.pathi tam mam katalog /site-packages. Mam również plik __init__.py.binw folderze Toolkit, aby wskazać Pythonowi, że jest to pakiet. Mam też __init__.py.binw katalogu przykładów.

Nie wiem, dlaczego Python nie może znaleźć pliku, gdy jest w nim sys.path. Jakieś pomysły? Czy może to być problem z uprawnieniami? Czy potrzebuję pozwolenia na wykonanie?

Eduardo
źródło
3
Sprawdź, czy masz uprawnienia do odczytu tego pliku z Pythona. Patrz: stackoverflow.com/a/20999950/1657225
cSn
1
Pamiętaj, aby oznaczyć swój katalog jako „Root Resources”, aby PyCharm wiedział, że jest to pakiet.
emmmphd
Problem w moim przypadku polegał na tym, że nie było uprawnień do nowo zainstalowanych modułów 755. To dlatego, że umaskna maszynie było 0027powodu których othersnie mają readuprawnień do modułu powoduje nie być odczytywane. Dodanie readpozwolenia naprawiło mój problem. Warto sprawdzić uprawnienia po instalacji katalogu docelowego.
anu
Spróbuj wydmuchać adres URL: stackoverflow.com/questions/47887614/…
Rawan-25,
może nazwa lokalnego katalogu to interface (był konflikt).
Benyamin Jafari,

Odpowiedzi:

267

Na podstawie twoich komentarzy do postu oripa sądzę, że tak się stało:

  1. Edytowałeś __init__.pyw systemie Windows.
  2. Edytor systemu Windows dodał coś, co nie jest drukowane, być może powrót karetki (koniec linii w systemie Windows to CR / LF; w systemie Unix to tylko LF), a może CTRL-Z (koniec pliku systemu Windows).
  3. Użyłeś WinSCP, aby skopiować plik do skrzynki uniksowej.
  4. WinSCP pomyślał: „To ma coś, co nie jest podstawowym tekstem; dodam rozszerzenie .bin, aby wskazać dane binarne”.
  5. Brak __init__.py(teraz nazywany __init__.py.bin) oznacza, że ​​Python nie rozumie zestawu narzędzi jako pakietu.
  6. Tworzysz __init__.pyw odpowiednim katalogu i wszystko działa ...?
John Fouhy
źródło
50
Także python -c 'import sys; print sys.path 'pomaga - czasami użytkownik umieścił pliki w nie skanowanej ścieżce.
mikebabcock
1
Korzystam z tej samej rzeczy, ale WinSCP nie dołączył .bin .
użytkownik
9
jeśli mam puste „__init__.py”, czy to samo się stanie?
boczek dietetyczny
2
OMG, rządzisz! Oto moja historia: 1. Edytowałeś init .py w systemie Windows 2. Dodałem TAB zamiast spacji 3. Często google aż do znalezienia tego postu! ;)
GBrian
1
Dla mnie problem polegał na tym, że korzystałem z niego, python driver.pykiedy powinienem go używać, python3 driver.pyponieważ instalowałem z pip3.
Eric Wiener
72

Robi

(local directory)/site-packages/toolkit

masz __init__.py?

Aby import mógł przechodzić przez katalogi, każdy katalog musi mieć __init__.pyplik.

igorgue
źródło
1
Słuszna uwaga! Uwaga: Od wersji Python 3.3 każdy katalog na sys.path o nazwie pasującej do nazwy pakietu zostanie rozpoznany.
PatrickT,
1
czy nie jest to konieczne tylko w przypadku względnych odniesień do ścieżki? dlaczego musi każdy katalog ma go?
Sonic Soul
56

Wpadłem na coś bardzo podobnego, kiedy wykonałem to ćwiczenie w LPTHW; Nigdy nie mogłem przekonać Pythona do rozpoznania, że ​​mam pliki w katalogu, z którego dzwonię. Ale w końcu udało mi się go uruchomić. To, co zrobiłem i co polecam, to spróbować:

(UWAGA: Z twojego początkowego postu zakładam, że używasz komputera z systemem * NIX i uruchamiasz rzeczy z wiersza poleceń, więc ta rada jest do tego dostosowana. Ponieważ uruchamiam Ubuntu, właśnie to zrobiłem)

1) Zmień katalog (cd) na katalog powyżej katalogu, w którym znajdują się twoje pliki. W takim przypadku próbujesz uruchomić mountain.pyplik i próbujesz wywołać toolkit.interface.pymoduł, który znajduje się w osobnych katalogach. W takim przypadku należy przejść do katalogu zawierającego ścieżki do obu tych plików (lub innymi słowy najbliższego katalogu, który współużytkują ścieżki obu tych plików). Który w tym przypadku jesttoolkit katalogiem.

2) Gdy jesteś w tookitkatalogu, wpisz ten wiersz kodu w wierszu poleceń:

export PYTHONPATH=.

To ustawia PYTHONPATH na „.”, Co w zasadzie oznacza, że ​​twój PYTHONPATH będzie teraz szukał wszystkich wywoływanych plików w katalogu, w którym aktualnie się znajdujesz (i, co więcej, do tego stopnia, w podkatalogach gałęzi katalogu, w którym się znajdujesz. Więc nie tylko przegląda bieżący katalog, ale wszystkie katalogi znajdujące się w bieżącym katalogu).

3) Po ustawieniu PYTHONPATH w powyższym kroku, uruchom moduł z bieżącego katalogu ( toolkitkatalogu). Python powinien teraz znaleźć i załadować określone moduły.

Mam nadzieję że to pomoże. Sam byłem z tego bardzo sfrustrowany.

Spectreace
źródło
2
Lub w systemie Windows set PYTHONPATH=..
cjbarth
To zadziałało dla mnie. ZUPEŁNIE uprościłem również moje frustracje związane z PYTHONPATH, ponieważ musiałbym aktualizować go do ścieżki bezwzględnej za każdym razem, gdy zmieniam maszyny. Dziekuję Dziekuję Dziękuję.
the_e
41

W systemie * nix upewnij się również, że PYTHONPATH jest poprawnie skonfigurowany, zwłaszcza że ma ten format:

 .:/usr/local/lib/python

(Pamiętaj o .: na początku, aby mógł przeszukiwać również bieżący katalog).

Może być także w innych lokalizacjach, w zależności od wersji:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Renaud
źródło
6
Może to być również .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7i itd. W zależności od wersji
Nikita Volkov
Dla mnie moduł znajduje się w /usr/local/lib/python3.4/dist-packages, ale kiedy piszę python3 w terminalu (ubuntu) i próbuję go zaimportować, nie pozwala mi to powiedzieć, że to nie istnieje „ImportError: nie istnieje moduł x”
użytkownik65165,
Dodawanie #!/usr/bin/pythonna końcu pliku również powinno działać, prawda?
Nearoo
1
@Nearoo Nie sądzę, że to zadziała. Plus zwykle ten shebang jest dodawany na górze pliku.
Renaud
2
Na MacOSX naprawiono to, dodając PYTHONPATH = / usr / local / lib / python2.7 / site-packages do skryptów startowych.
Johan Snowgoose,
23

Rozwiązałem własny problem i napiszę podsumowanie rzeczy, które były złe, i rozwiązanie:

Plik musi być nazwany dokładnie __init__.py. Jeśli rozszerzenie jest inne, jak w moim przypadku, .py.binPython nie może poruszać się po katalogach, a następnie nie może znaleźć modułów. Aby edytować pliki, musisz użyć edytora Linux, takiego jak vi lub nano . Jeśli używasz edytora Windows, napiszę ukryte znaki.

Innym problemem, który miał na to wpływ, było to, że miałem inną wersję Pythona zainstalowaną przez roota, więc jeśli ktoś pracuje z lokalną instalacją Pythona, upewnij się, że instalacja Pythona, która uruchamia programy, to lokalny Python. Aby to sprawdzić, po prostu zróbwhich python i sprawdź, czy plik wykonywalny znajduje się w katalogu lokalnym. Jeśli nie, zmień ścieżkę, ale upewnij się, że lokalny katalog Python jest wcześniejszy niż inny Python.

Eduardo
źródło
Problem, który dostałem, polegał na tym, że moduł został (ponownie) zainstalowany przez pip, do którego dostęp miał tylko użytkownik root, więc użytkownik, który uruchomił program, nie widział go.
Jānis Elmeris
@ JānisElmeris, czy możesz rozwinąć więcej informacji na temat powyższego komentarza, myślę, że mam również podobny błąd. Mam swoje __init__.pypliki umieszczone w odpowiednim katalogu, ale ręcznie zainstalowałem pakiet za pomocą setup.py. W jaki sposób instalacja nowego pakietu zakłóciłaby import.
Krishna Oza,
@ Dart_coder, przepraszam, to było sześć lat temu i nie pamiętam sprawy. Poza tym ostatnio bardzo mało mam do czynienia z Pythonem. Z tego, co napisałem, mogę po prostu myśleć, że zainstalowałem pakiet jako root, co zmieniło uprawnienia, aby inni użytkownicy nie mieli dostępu, który mieli wcześniej.
Jānis Elmeris,
19

łatwym rozwiązaniem jest instalacja modułu za pomocą sudo python -m pip install <library-name>zamiast pip install <library-name>ograniczeń administracyjnych

Badr Bellaj
źródło
2
Co python -mosiąga przed sobą pip install?
sporc
1
@sporc - gdy używasz flagi wiersza polecenia -m, Python zaimportuje moduł lub pakiet, a następnie uruchomi go jako skrypt. Gdy nie używasz flagi -m, nazwa pliku jest uruchamiana tylko jako skrypt.
Tony Ciccarone
Nie jestem pewien, co ta odpowiedź próbuje powiedzieć, że wrt python -m pip...działa, ale pip...nie: są w rzeczywistości tym samym, zakładając, że faktycznie znajdują się w tym samym pythonkatalogu. Być może zaobserwowana sytuacja była taka, że ​​samodzielny pipprogram nie był dostępny w niektórych starszych wersjach Pythona (ale jest teraz w wersji 2.7 i 3.x). W takim przypadku pythonplik był w lokalnym virtualenv i pipnie był, więc python -m pip installinstalowałby się w lokalnym virtualenv, podczas gdy pippróbowałby zainstalować w Pythonie systemowym (i nie działał bez sudo). W każdym razie nie ma to sensu.
Michael
17

Czy oznaczenie katalogu jako pakietu wymaga pliku o nazwie __init__.py, czy to pomaga?

orip
źródło
Mam już plik o nazwie init .py.bin, jeśli zmienię nazwę na init .py, wtedy pojawia się błąd: /__init__.py ", wiersz 1„ narzędzia ”,„ demo ”] ^ Błąd składni: nieprawidłowa składnia
Eduardo,
Co zawiera init .py? Opublikuj to jako część swojego pytania.
S.Lott,
Nie ma nic, jest pusta, to było z pakietem, który pobieram, czy muszę coś zapisać w pliku ?.
Eduardo,
@ S.Lott: nie musisz niczego umieszczać w swoim pliku .py, prawda?
igorgue
1
@Eduardo. Twój plik init .py dostaje błąd. I mówisz, że jest pusty. Trudno to pogodzić. I nie można go nazwać init .py.bin - Python zignoruje ten plik. Zazwyczaj nie może mieć w tym nic.
S.Lott,
16

Za pomocą PyCharm(części pakietu JetBrains) musisz zdefiniować katalog skryptów jako Źródło:
Right Click > Mark Directory as > Sources Root

MonoThreaded
źródło
12

Czytasz tę odpowiedź, mówi, że jesteś __init__.pywe właściwym miejscu, zainstalowałeś wszystkie zależności i nadal otrzymujesz ImportError.

Miałem do czynienia z podobnym problemem, z tym wyjątkiem, że mój program działałby dobrze, gdy był uruchamiany przy użyciu PyCharm, ale powyższy błąd, gdy uruchamiałbym go z terminala. Po dalszym kopaniu dowiedziałem się, że PYTHONPATHnie mam wpisu do katalogu projektu. Tak więc ustawiłem PYTHONPATHdla instrukcji importu działa na PyCharm, ale nie z terminala :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Jest na to inny sposób, używając sys.path:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Możesz użyć wstawiania / dołączania na podstawie kolejności wyszukiwania projektu.

śr
źródło
12

Dla mnie było to coś naprawdę głupiego. Zainstalowałem bibliotekę używając, pip3 installale uruchomiłem mój program python program.pyw przeciwieństwie do python3 program.py.

kev
źródło
1
Łał ! To też działało dla mnie.
JavaDeveloper
1
Uratowałeś mi dzień.
Aymen
7

Tak. Potrzebujesz katalogu zawierającego __init__.pyplik, który jest plikiem inicjującym pakiet. Spójrz na to .

Pliki __init__.py są wymagane, aby Python traktował katalogi jako zawierające pakiety; Ma to na celu zapobieganie przypadkowemu ukrywaniu prawidłowych modułów pojawiających się później na ścieżce wyszukiwania modułów w katalogach o wspólnej nazwie, takich jak łańcuch. W najprostszym przypadku __init__.py może być tylko pustym plikiem, ale może także wykonać kod inicjujący pakiet lub ustawić zmienną __all__, opisaną później.

Miya
źródło
6
  1. Plik __ init__.py musi znajdować się w tym samym katalogu, w którym jest importowany plik.
  2. Nie można zaimportować pliku o tej samej nazwie i być plikiem z 2 folderów skonfigurowanych na PYTHONPATH.

np .: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

A jeśli próbujesz zaimportować plik foo, python nie będzie wiedział, który chcesz.

z importu foo ... >>> importerror: brak modułu o nazwie foo

Iasmini Gomes
źródło
5

Moje dwa centy:

wprowadź opis zdjęcia tutaj

Pluć:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

To mnie zmieszało - przeszedłem przez posty i posty sugerujące brzydkie hacki syspath (jak widzisz moje __init__.pybyły tam wszystkie). Okazuje się, że game / oblivion.py i game / oblivion były mylącym pythonem, który wyrzucił raczej nieprzydatne „Brak modułu o nazwie RecordGroups”. Byłbym zainteresowany obejściem i / lub linkami dokumentującymi to zachowanie (ta sama nazwa) -> EDYCJA (2017.01.24) - spójrz na Co jeśli mam moduł i pakiet o tej samej nazwie? Co ciekawe zwykle pakiety mają pierwszeństwo, ale najwyraźniej nasz program uruchamiający to narusza.

EDYCJA (2015.01.17): Nie wspomniałem, że używamy niestandardowego programu uruchamiającego opisanego tutaj .

Mr_i_Mrs_D
źródło
bardziej jak ścieżka jest wyłączona. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Może chcesz to naprawić, dodając kod Pythona, aby użyć:game.oblivion.patchers.RecordGroups
Dwight Spencer
@DwightSpencer: Jestem pewien, że zaimportowałem „RecordGroups”, game.oblivion.__init__.pyale być może będę musiał to sprawdzić
Mr_and_Mrs_D,
4

Linux: zaimportowane moduły znajdują się w /usr/local/lib/python2.7/dist-packages

Jeśli używasz modułu skompilowanego w C, nie zapomnij później przeskoczyć do pliku .so sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
KrisWebDev
źródło
3

W moim przypadku problem polegał na tym, że łączyłem się z debugowaniem python & boost::Python, co wymaga, aby rozszerzenie było FooLib_d.pydnie tylko FooLib.pyd; zmiana nazwy pliku lub aktualizacja CMakeLists.txtwłaściwości naprawiły błąd.

Peter Karasev
źródło
3

Jeśli wypróbowałeś wszystkie metody podane powyżej, ale nie powiodło się, być może moduł ma taką samą nazwę jak moduł wbudowany. Lub moduł o tej samej nazwie istniejący w folderze, który ma wyższy priorytet sys.pathniż moduł.

Aby debugować, wypowiedz swoje from foo.bar import bazskargi ImportError: No module named bar. Zmiana na import foo; print foo, która pokaże ścieżkę foo. Czy tego oczekujesz?

Jeśli nie, zmień nazwę foolub użyj importu bezwzględnego .

liushuaikobe
źródło
1
Dla mnie to daje ImportError: No module named foo.
alex
3

Mój problem polegał na tym, że dodałem katalog z __init__.pyplikiem do PYTHONPATH, kiedy tak naprawdę potrzebowałem dodać jego katalog nadrzędny.

Bogaty
źródło
3

Do wszystkich, którzy nadal mają ten problem. Uważam, że Pycharm myli się z importem. Dla mnie, gdy piszę „importuj z przestrzeni nazw”, poprzednia linia jest podkreślona na czerwono, sygnalizując, że wystąpił błąd, ale działa. Jednak „” z importu .namespace coś ”nie jest podkreślane, ale także nie działa.

Próbować

try:
    from namespace import something 
except NameError:
    from .namespace import something
AKJ
źródło
1
Pierwszy to składnia python 2, drugi to python 3.
Tanya Branagan
2

Naprawiłem mój problem pisząc print (sys.path)i stwierdziłem, że Python używa nieaktualnych pakietów pomimo czystej instalacji. Usunięcie tych wykonanych pythonów automatycznie używa poprawnych pakietów.

cytrynowy
źródło
2

W moim przypadku, ponieważ używam PyCharm i PyCharm, tworzę „venv” dla każdego projektu w folderze projektu, ale jest to tylko mini env Pythona. Chociaż masz zainstalowane biblioteki, których potrzebujesz w Pythonie, ale w niestandardowym projekcie „venv” nie jest ono dostępne. To jest prawdziwy powód „ImportError: W PyCharm nie wystąpił żaden moduł o nazwie xxxxxx”. Aby rozwiązać ten problem, musisz dodać biblioteki do niestandardowej środowiska projektu, wykonując następujące kroki:

  • W PyCharm, z menu „Plik” -> Ustawienia
  • W oknie dialogowym Ustawienia Project: XXXProject-> Project Interpreter
  • Kliknij przycisk „Dodaj”, wyświetli się okno dialogowe „Dostępne pakiety”
  • Przeszukaj bibliotekę, kliknij „Zainstaluj pakiet”
  • Następnie cały potrzebny pakiet zostanie zainstalowany w niestandardowym folderze „venv” projektu.

Okno dialogowe ustawień

Cieszyć się.

Yuanhui
źródło
0

Po tym samym problemie stwierdziłem, że moją decyzją było usunięcie wszystkich pyc plików z mojego projektu, wygląda na to, że te buforowane pliki w jakiś sposób spowodowały ten błąd.

Najłatwiejszym sposobem, aby to zrobić, było przejście do folderu projektu w Eksploratorze Windows i wyszukiwanie *.pyc, a następnie wybranie wszystkich ( Ctrl+ A) i usunięcie ich ( Ctrl+X ).

Możliwe, że mogłem rozwiązać problemy, usuwając konkretny pycplik, ale nigdy tego nie próbowałem

Sayse
źródło
0

I w obliczu tego samego problemu: Import error. Ponadto biblioteka została poprawnie zainstalowana w 100%. Źródłem problemu było to, że na moim PC 3 została zainstalowana wersja Pythona (pakiet anakonda). Właśnie dlatego biblioteka została zainstalowana nie we właściwym miejscu. Potem właśnie zmieniłem na odpowiednią wersję Pythona w moim PyCharm IDE.

Rocketq
źródło
0

Miałem ten sam błąd. Było to spowodowane tym, że ktoś utworzył folder w tym samym folderze co mój skrypt, którego nazwa kolidowała z modułem, który importowałem z innego miejsca. Zamiast importować moduł zewnętrzny, zajrzał do tego folderu, który oczywiście nie zawierał oczekiwanych modułów.

Toivo Säwén
źródło
0

Miałem ten sam problem (Python 2.7 Linux), znalazłem rozwiązanie i chciałbym się nim podzielić. W moim przypadku miałem poniższą strukturę:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

W „main.py” próbowałem bezskutecznie wszystkich poniższych kombinacji:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

Rozwiązanie było znacznie prostsze niż myślałem. Zmieniłem nazwę folderu „Booklet” na „booklet” i to wszystko. Teraz Python może normalnie zaimportować pytanie klasy, używając w pliku „main.py” kodu:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Na tej podstawie mogę stwierdzić, że Nazwy pakietów (foldery), takie jak „broszura”, muszą zaczynać się małymi literami, w przeciwnym razie Python pomyli je z nazwami klas i nazwami plików.

Najwyraźniej to nie był twój problem, ale odpowiedź Johna Fouhy jest bardzo dobra i ten wątek zawiera prawie wszystko, co może powodować ten problem. Jest to jeszcze jedna rzecz i mam nadzieję, że może to może pomóc innym.

ioaniatr
źródło
0

W moim przypadku podałem ścieżkę do folderu package.egg zamiast rzeczywistego pakietu poniżej. Skopiowałem pakiet na najwyższy poziom i zadziałało.

Fakrudeen
źródło
0

To działało dla mnie: Utworzono __init__.pyplik w folderze nadrzędnym (w twoim przypadku w site-packagesfolderze wewnętrznym ). I importowane w ten sposób:

from site-packages.toolkit.interface import interface

Mam nadzieję, że przyda ci się również!

Sherzod
źródło
0

Na serwerze linux spróbuj dos2unix script_name

(usuń wszystkie (jeśli istnieją) pycpliki za pomocą polecenia find . -name '*.pyc' -delete)

i uruchom ponownie w przypadku, jeśli pracowałeś nad skryptem w systemie Windows

Poli
źródło
0

W moim przypadku użyłem sys.path.insert()do zaimportowania modułu lokalnego i pobierałem module not foundz innej biblioteki. Musiałem sys.path.insert()obniżyć zgłoszony importmodule not found . Myślę, że najlepszą praktyką jest umieszczenie sys.path.insert()na dole importu.

Michał Zawadzki
źródło