Błąd PyCharm: „Brak modułu” podczas próby zaimportowania własnego modułu (skrypt Pythona)

161

Napisałem moduł ( my_mod.pyplik znajdujący się w folderze my_module). Obecnie pracuję na pliku cool_script.pyznajdującym się w folderze cur_proj. Otworzyłem folder w PyCharm za pomocą File - open (i zakładam, że jest to projekt PyCharm).

W ProjectView (CMD-7) widzę swój projekt cur_proj(na czerwono), a pod „Bibliotekami zewnętrznymi” widzę my_module. W cool_script.py mogę pisać

from my_module import my_mod as mm

a PyCharm sugeruje nawet my_mod. Na razie w porządku.

Jednak gdy próbuję uruchomić cool_script.py, PyCharm mówi mi „Żaden moduł o nazwie my_module”

Wydaje mi się to dziwne, ponieważ

A) w terminalu (OS 10.10.2), w pythonie mogę zaimportować moduł bez problemu - jest odpowiedni wpis w PYTHONPATH w .bashrc

B) w PyCharm - Ustawienia - Projekt cur_proj - Interpreter projektu - Koło zębate obok interpretera Pythona - więcej - pokazuje ścieżki dla wybranej ikony interpretera, pojawiają się ścieżki z PYTHONPATH (tak jak myślę, że powinny)

W związku z tym, dlaczego pojawia się błąd, gdy próbuję uruchomić cool_script.py? - Czego mi brakuje?

Uwagi:

Dodatek 2015-luty-25

Kiedy przechodzę do PyCharm, aby uruchomić - Edytuj konfiguracje, dla mojego bieżącego projektu są dwie opcje zaznaczone znacznikiem wyboru: „ Dodaj katalogi główne zawartości do PYTHONPATH ” i „ Dodaj katalogi źródłowe do PYTHONPATH ”. Po odznaczeniu obu mogę załadować mój moduł.

Więc teraz działa - ale dlaczego ?

Pojawiły się dalsze pytania:

  • Co to są „korzenie zawartości”, a co „źródła źródłowe”? I dlaczego dodanie czegoś do PYTHONPATH powoduje jej awarię?
  • czy powinienem zawsze odznaczać obie te opcje (a więc również w ustawieniach domyślnych, nie tylko w konfiguracjach specyficznych dla projektu (lewy panel okna dialogowego Uruchom / debuguj konfiguracje)?
Mikołaj
źródło
2
Być może już tego próbowałeś, ale importując moduły z innych pakietów, dołącz nazwę pakietu from foldername.mymodule import mymethod. Kolejną rzeczą, którą musiałem zrobić, jest dodanie pustego folderu _init .py do wszystkich folderów, których używałbyś, aby dostać się do swojego modułu, więc w przypadku, from parentfolder.childfolder.mymodule ...gdybyś potrzebował init w dwóch folderach. W zależności od tego, gdzie znajdują się foldery względem siebie, może być potrzebny pakiet najwyższego poziomu, sys.pathzgodnie z opisem w tej odpowiedzi
ziddarth
4
Ja też miałem twój problem. Poniższy post rozwiązał moje problemy: stackoverflow.com/questions/21236824/ ...
user3155053
Czy zidentyfikowałeś, dlaczego odznaczanie tych pól wyboru faktycznie działa, a nie ich zaznaczanie?
Nithish Inpursuit Ofhappiness,
U mnie zadziałało usunięcie zaznaczenia Enable Django Supportw ustawieniach Languages & Frameworks -> Djangow wersji Pro PyCharm. To było otwarcie konsoli django, która spowodowała problemy z importem.
Eric Blum

Odpowiedzi:

324

Jeśli twój własny moduł znajduje się na tej samej ścieżce, musisz oznaczyć ścieżkę jako Sources Root. W eksploratorze projektów kliknij prawym przyciskiem myszy katalog, który chcesz zaimportować. Następnie wybierz Mark Directory Asi wybierz Sources Root.

Mam nadzieję, że to pomoże.

Beatriz Fonseca
źródło
9
To zadziałało dla mnie, ale musiałem również usunąć i ponownie utworzyć konfigurację uruchamiania, którą utworzyłem wcześniej przed oznaczeniem folderu jako głównego źródła.
grinch
2
I trzeba dodać, __init__.pyaby Python traktował katalogi jako zawierające pakiety: stackoverflow.com/questions/448271/ ...
Beatriz Fonseca
Jak byś to zrobił, gdybyś nie używał pycharm? Mam dokładnie ten sam problem.
Boudewijn Aasman
@BeatrizFonseca Tak, zrobiłem. Nie mogłem zmusić go do pracy w wysublimowanym, ale zainstalowałem pycharm i wypróbowałem tutaj odpowiedź i działało doskonale, więc musi to mieć coś wspólnego z określeniem właściwego katalogu jako pakietu głównego.
Boudewijn Aasman
@BoudewijnAasman, możesz spróbować użyć .przed nazwą pakietu, aby określić, że ten pakiet jest pakietem lokalnym
Beatriz Fonseca
38

Więc jeśli pójdziesz do

-> Ustawienia -> Projekt: Mój_projekt -> Struktura projektu,

Po prostu katalog, w którym dostępny jest kod źródłowy i oznacz go jako „Źródła” (możesz go zobaczyć w tym samym oknie). Katalog z kodem źródłowym powinien zmienić kolor na niebieski. Teraz możesz importować moduły znajdujące się w tym samym katalogu.

JRD
źródło
3
Zdaję sobie sprawę, że to stary post, ale zadziałał dzięki.
Mike - SMT
1
Wiele razy spotkałem się i zignorowałem tę samą odpowiedź, tym razem próbowałem i działa!
A.Ametov
29

PyCharm Community / Professional 2018.2.1

Miałem ten problem właśnie teraz i udało mi się go rozwiązać w podobny sposób, jak wskazali @Beatriz Fonseca i @Julie.

Jeśli przejdziesz do File-> Settings-> Project: YourProjectName-> Project Structure, będziesz mieć układ katalogu projektu, w którym aktualnie pracujesz. Będziesz musiał przejrzeć swoje katalogi i oznaczyć je jako Sourcekatalog dla wszystkich plików źródłowych lub jako Resourcefolder na pliki przeznaczone wyłącznie do importowania.

Będziesz także chciał upewnić się, że umieszczasz __init__.pypliki w katalogach zasobów lub naprawdę w dowolnym miejscu, z którego chcesz importować, i będzie działać idealnie.

Mam nadzieję, że ta odpowiedź komuś pomoże i mam nadzieję, że JetBrains naprawi ten irytujący błąd.

Oleg Silkin
źródło
2
Nie jest to specyficzne dla PyCharm Professional , raczej ta funkcja jest dostępna również w wydaniu PyCharm Community . W strukturze projektu kliknij prawym przyciskiem myszy katalog zawierający moduł, a następnie wybierz Mark Directory asz menu kontekstowego i wybierz Sources Root.
Astitva Srivastava
1
Czy możesz doradzić, co oznacza ten korzeń źródeł. Chociaż rozwiązało to mój problem, ale nie do końca zrozumiałem, dlaczego to robię.
user3341078
8

Próbowałem znaleźć lokalizację, w której znajdują się moje pliki.

na przykład E:\git_projects\My_project\__init__.py is my location.

Poszedłem do File -> Setting -> Project: My_project -> Project Structure i dodałem katalog główny zawartości do miejsca wzmianki E:\git_projects\My_project

to działało dla mnie.

Virendra Patel
źródło
2
Źródło folderu w strukturze projektu zadziałało dla mnie. Dzięki.
Microos
Dzięki @Virendra Patel i @Microos. Mój projekt pycharm jest w toku /home/my_user/git_projects/this_git_project/this_pycharm_project/. Dodałem /home/my_user/git_projects/this_git_project/jako katalog główny zawartości i /home/my_user/git_projects/this_git_project/this_pycharm_project/jako jedyny folder źródłowy i wszystko w końcu się udało.
KLaz
3

my_modulejest folderem, a nie modułem i nie możesz zaimportować folderu, spróbuj przenieść się my_mod.pydo tego samego folderu, cool_script.pya następnie zrób import my_mod as mm. Dzieje się tak, ponieważ Python szuka tylko w bieżącym katalogu i sys.pathnie znajdzie, my_mod.pychyba że znajduje się w tym samym katalogu

Możesz też poszukać tutaj odpowiedzi, która mówi, jak importować z innych katalogów.

Co do innych pytań, nie wiem, ponieważ nie używam PyCharm.

Tomek
źródło
Możesz utworzyć init .py w folderze, interpreter Pythona odczyta jako pakiet pythona: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca
3

Pojawił się również błąd dotyczący „Dodaj korzenie źródłowe do PYTHONPATH”. Mój problem polegał na tym, że miałem dwa foldery o tej samej nazwie, na przykład project/subproject1/thing/srci project/subproject2/thing/srci miałem oba oznaczone jako źródłowy katalog główny. Kiedy zmieniłem nazwę jednego z "thing"folderów na "thing1"(dowolna unikalna nazwa), zadziałało.

Może jeśli PyCharm automatycznie dodaje wybrane źródła źródłowe, nie używa pełnej ścieżki i dlatego miesza foldery o tej samej nazwie.

RubberDuckRabbit
źródło
2

Może to być spowodowane tym, że interpreter języka Python nie może znaleźć Twojego kodu. Musisz wyraźnie wspomnieć o tym w Pythonie, aby znaleźć kod w tej lokalizacji.

Aby to zrobić:

  • Przejdź do konsoli Pythona
  • Dodaj sys.path.extend(['your module location'])do konsoli Pythona.

W Twoim przypadku:

  • Przejdź do konsoli Pythona,
  • Na początku napisz następujący kod:

    import sys
    sys.path.extend([my module URI location])
  • Po napisaniu tej instrukcji możesz uruchomić następujące polecenie:

    from mymodule import functions
Shravan Shetty
źródło
Trochę brzydko dodać taką ścieżkę, ale dla mnie zadziałało.
Florian Blume,
powinien to zrobić pycharm, automatycznie otwierając konsolę powinien dołączyć komendy sys.path.extend dla katalogów zawierających zależności (inne projekty) oraz katalogów zawierających kod źródłowy aktualnego projektu. ALE NIE robi tego automatycznie
fabiob
2

Kluczowym mylącym krokiem, który należy wykonać, jest ponowne utworzenie konfiguracji uruchamiania dla pliku źródłowego, który próbujesz wykonać, tak aby IDE pobierało nowe ścieżki.

Sposób, który faktycznie zadziałał, to przejście do Run / Edit Configurations ..., wybierz konfigurację dla pliku, który próbujesz uruchomić po lewej stronie, odznacz pole „Dodaj źródłowe korzenie do PYTHONPATH”, zapisz, a następnie wróć, zaznacz pole i zapisz. WTEDY to zadziała.

tomchappell
źródło
O dziwo, tego właśnie potrzebowałem, mimo że robiłem Invalidate Cache/Restartdwa razy!
Josh Friedlander
1

Katalogi główne zawartości to foldery zawierające kod projektu, podczas gdy katalogi źródłowe są zdefiniowane jako takie same. Jedyną różnicą, którą zrozumiałem, było to, że kod w źródłowych korzeniach jest zbudowany przed kodem w katalogu głównym zawartości.

Odznaczenie ich nie wpłynęłoby na środowisko wykonawcze do momentu, w którym nie tworzysz oddzielnych modułów w swoim pakiecie, które są ręcznie podłączane do Django. Oznacza to, że jeśli którykolwiek z twoich plików nie zawiera 'from django import ...' lub żadna z funkcji nie jest wywoływana przez django, odznaczenie tych dwóch opcji spowoduje nieprawidłowe działanie.

Aktualizacja - problem pojawia się tylko podczas korzystania z Virtual Environmanet i tylko podczas sterowania projektem za pośrednictwem dostarczonego terminala. Ponieważ terminal nadal działa przez domyślny pyhtonpath systemowy, a nie wirtualny env. podczas gdy panel sterowania python django działa dobrze.

RA123
źródło
1

Rozwiązaniem tego problemu bez konieczności oznaczania katalogu jako źródła źródłowego jest edycja konfiguracji uruchamiania iw wykonaniu wybierz opcję „Przekieruj dane wejściowe z” i wybierz skrypt, który chcesz uruchomić. To działa, ponieważ jest wtedy traktowane tak, jakby skrypt był uruchamiany interaktywnie w tym katalogu. Jednak Python nadal będzie oznaczał nazwę modułu błędem „brak modułu o nazwie x”:

Przekieruj dane wejściowe z:

Kiedy interpreter wykonuje instrukcję import, szuka x.py na liście katalogów zebranych z następujących źródeł:

  1. Katalog, z którego został uruchomiony skrypt wejściowy lub katalog bieżący, jeśli interpreter jest uruchamiany interaktywnie
  2. Lista katalogów zawartych w zmiennej środowiskowej PYTHONPATH, jeśli jest ustawiona.
  3. Zależna od instalacji lista katalogów skonfigurowana podczas instalowania Pythona, w moim przypadku usr / lib / python3.6 na Ubuntu.
PyFox
źródło
0

Pycharm 2017.1.1

  1. Kliknij View->ToolBar&View->Tool Buttons
  2. W lewym panelu Projectbyłby widoczny, kliknij prawym przyciskiem myszy i naciśnij, Autoscroll to source a następnie uruchom kod.

To zadziałało dla mnie.

AB Abhi
źródło
0

ln -s. someProject

Jeśli masz someDirectory / someProjectDir i dwa pliki, plik1.py i plik2.py, a plik1.py spróbuje zaimportować z tym wierszem

z jakiegoś pliku importuProjectDir 2

To nie zadziała, nawet jeśli wyznaczyłeś someProjectDir jako katalog źródłowy, a nawet jeśli jest on wyświetlany w preferencjach, projekcie, menu struktury projektu jako katalog główny zawartości. Jedynym sposobem, w jaki to zadziała, jest połączenie projektu, jak pokazano powyżej (polecenie unix, działa w systemie Mac, brak pewności użycia lub składni w systemie Windows). Wydaje się, że istnieje mechanizm, w którym Pycharm robi to automatycznie albo przy pobieraniu z kontroli wersji, albo dodając jako kontekstowy katalog główny, ponieważ miękki link został utworzony przez Pycharm w zależnym projekcie. Stąd po prostu skopiowanie tego samego, chociaż dziwna replikacja katalogu jest denerwująca, a konieczność jest kłopotliwa. Również w zależności, w której utworzono automatycznie, nie jest wyświetlany jako nowy katalog pod kontrolą wersji. Być może porównanie plików .idea ujawni więcej.

user10895922
źródło
-1

Odpowiedź, która dla mnie zadziałała, była rzeczywiście tym, o czym OP wspomina w swojej aktualizacji 2015: odznacz te dwa pola w konfiguracji uruchamiania Pythona:

  • „Dodaj katalog główny treści do PYTHONPATH”
  • „Dodaj korzenie źródłowe do PYTHONPATH”

Miałem już ustawioną konfigurację uruchamiania, aby używać właściwego venv, więc PyCharm wykonywanie dodatkowej pracy w celu dodania rzeczy do ścieżki nie było konieczne. Zamiast tego powodował błędy.

bsberry
źródło