Nierozwiązany problem referencyjny w PyCharm

373

Mam strukturę katalogów

├── simulate.py
├── src
   ├── networkAlgorithm.py
   ├── ...

I mogę uzyskać dostęp do modułu sieciowego za pomocą sys.path.insert().

import sys
import os.path
sys.path.insert(0, "./src")
from networkAlgorithm import *

Jednak pycharm skarży się, że nie może uzyskać dostępu do modułu. Jak mogę nauczyć pycham rozpoznawania odwołania?

wprowadź opis zdjęcia tutaj

prosseek
źródło
4
Czy folder src ma __init__.pyplik?
Maskonur GDI
@Puffin GDI: Nie, nie ma.
prosseek
5
@PuffinGDI Czy foldery src potrzebują tego pliku .py init ?
Jack Chi
Tak, aby python mógł zidentyfikować pakiety: stackoverflow.com/questions/42094723/...
rnoodle
Zmieniłem nazwę nazwy klasy i kontynuuję pracę nad nią. Kiedy nacisnąłem Run, wystąpił ten błąd, całkowicie zapomniałem zmiany nazwy i próbowałem szukać sugestii Pycharm podczas importu. Cholera, w sugestiach rozróżniana jest wielkość liter! - Nowy w Pythonie !!
Vignesh Paramasivam

Odpowiedzi:

817

Ręczne dodawanie go tak, jak zostało to zrobione, jest rzeczywiście jednym ze sposobów, aby to zrobić, ale istnieje prostsza metoda, polegająca na tym, że wystarczy powiedzieć pycharm, że chcesz dodać srcfolder jako źródłowy katalog główny, a następnie dodać źródłowy katalog główny do swojego pytona ścieżka.

W ten sposób nie musisz sztywno kodować rzeczy w ustawieniach tłumacza:

  • Dodaj srcjako źródło treści źródłowej:

                            wprowadź opis zdjęcia tutaj

  • Następnie dodaj źródła do PYTHONPATH:

wprowadź opis zdjęcia tutaj

  • Teraz import zostanie rozwiązany:

                      wprowadź opis zdjęcia tutaj

W ten sposób możesz dodać, co chcesz, jako źródłowy katalog główny, a wszystko po prostu zadziała. Jeśli jednak odznaczysz go jako źródłowy katalog główny, pojawi się błąd:

                                  wprowadź opis zdjęcia tutaj

Po tym wszystkim nie zapomnij uruchomić ponownie. W menu PyCharm wybierz: Plik -> Unieważnij pamięć podręczną / Uruchom ponownie

Games Brainiac
źródło
16
Działa to również, jeśli używasz wtyczki Python z IntelliJ.
rob mayoff
13
To rozwiązanie działa. Problem polega na tym, że gdy inny programista pobiera kod z svn, musi ponownie wprowadzić te same ustawienia, aby pozbyć się komunikatu o błędzie „nierozstrzygnięte odwołanie”.
Ben Lin
2
@GamesBrainiac, rozwiązaniem jest to, że IDE może parsować „sys.path.insert (0,„ ./src ”)” dodać to do PYTHONPATH dla tego konkretnego pliku, a następnie podać odpowiednią analizę składni.
Ben Lin
2
Musisz także upewnić się, że ścieżka do katalogu głównego treści jest poprawna. W pycharm 5 znajdziesz to w Preferencjach -> Projekt -> Struktura projektu.
lps
1
O dziwo, podkatalogi nie są brane pod uwagę. Na przykład, jeśli poniżej src, mamy viewsfolder, w którym mam myview.py, wciąż pojawia się nierozwiązany błąd odniesienia podczas próby from src.views.myview import <my_function>...
SexyBeast
49
  1. sprawdź __init__.pyplik w srcfolderze
  2. dodaj srcfolder jako źródłowy katalog główny
  3. Następnie pamiętaj, aby dodać źródła do swojego PYTHONPATH(patrz wyżej)
  4. w menu PyCharm wybierz: Plik -> Unieważnij pamięć podręczną / Uruchom ponownie
Ukr
źródło
11
Ten ostatni krok był jedyną rzeczą, której brakowało w moim rozwiązaniu. Zaakceptowana odpowiedź może do tego dodać.
aimbire
bez ostatniego wspomnianego kroku zaakceptowana odpowiedź nie działa. Zaakceptowana odpowiedź powinna również dodać ten krok /
santhosh kumar
23

Jeśli ktoś nadal na to patrzy, zaakceptowana odpowiedź nadal działa w PyCharm 2016.3, kiedy próbowałem. Interfejs użytkownika mógł się zmienić, ale opcje są nadal takie same.

to znaczy. Kliknij prawym przyciskiem myszy folder główny -> „Oznacz katalog jako” -> Katalog źródłowy

AeroHil
źródło
1
Tyle złożonych odpowiedzi w tej dyskusji. Przedstawione tutaj rozwiązanie działało dla mnie tak łatwo.
16

Po przetestowaniu wszystkich obejść proponuję przyjrzeć się Settings -> Project -> project dependenciesi zmienić ich rozmieszczenie.

preferencja pycharm

mehdi
źródło
To działa idealnie dla mnie. Zainstalowałem pygametam i nie ma już nierozwiązanego problemu referencyjnego!
Michał Przybylowicz
5

Zasadniczo jest to problem z brakującym pakietem, po prostu umieść kursor w nierozwiązanym odwołaniu i naciśnij, Alt+Enteraby wyświetlić opcje, a następnie powinieneś wiedzieć, jak go rozwiązać.

Ch_y
źródło
4

Po wykonaniu zaakceptowanej odpowiedzi, zrobienie tego rozwiązało dla mnie:

FileSettingsProject <your directory/project>Project Dependencies

Wybierz katalog / projekt, w którym znajduje się plik z nierozstrzygniętym importem, i zaznacz pole wyboru, aby poinformować Pycharm, że ten projekt zależy od innego projektu.

Moja hierarchia folderów różni się nieco od tej w pytaniu. Mój jest taki

├── MyDirectory  
     └── simulate.py  
├── src  
     ├── networkAlgorithm.py  
     ├── ...

Mówienie Pycharmowi, że src zależy od MyDirectoryrozwiązanego problemu dla mnie!

Benzoes
źródło
4

Chociaż wszystkie odpowiedzi są naprawdę pomocne, jest jedna drobna informacja, którą należy wyjaśnić wyraźnie:

  • Zasadniczo projekt z wieloma katalogami hierarchicznymi działa jako pakiet z pewnymi atrybutami.
  • Aby zaimportować niestandardowe utworzone lokalnie klasy, musimy przejść do katalogu zawierającego .pyplik i utworzyć tam __init__.py(pusty) plik.

Pomaga to dlatego, że ten plik jest wymagany, aby Python traktował katalog jako zawierający pakiety. Twoje zdrowie!

Muhammad Waqas Kayani
źródło
3

Zainstaluj przez PyCharm (współpracuje z edycją Community). Otwórz, Settings > Project > Project Interpretera następnie kliknij zieloną ikonę + na zrzucie ekranu poniżej. W drugim oknie dialogowym, które zostanie otwarte, wprowadź nazwę pakietu i kliknij przycisk „Zainstaluj pakiet”.

wprowadź opis zdjęcia tutaj

danday74
źródło
1

Sprawdź, czy używasz właściwego tłumacza, którego powinieneś. Pojawił się błąd „nierozwiązany odnośnik„ django ””, aby rozwiązać ten problem. Zmieniłem interpreter projektu (zmieniłem Python 3 na Python 2.7) z ustawień projektu: wybierz Projekt, przejdź do Plik -> Ustawienia -> Projekt: -> Projekt Interpreter -> Brwi i Wybierz poprawną wersję lub interpreter (np. /usr/bin/python2.7).

kishs1991
źródło
1

W moim przypadku problemem było to, że używałem, Virtual environmentktóry nie miał dostępu do globalnych pakietów witryn. Dlatego interpreter nie był świadomy nowo zainstalowanych pakietów.

Aby rozwiązać problem, po prostu edytuj lub odtwórz swojego wirtualnego tłumacza i zaznacz Inherit global site-packagesopcję.

wprowadź opis zdjęcia tutaj

Dan
źródło
Czy nie ma to niepożądanych konsekwencji i nie pokonuje jednego z powodów korzystania z wirtualnego środowiska? Oznacza to, że jeśli gdzieś zabierzesz to środowisko i zostaną zainstalowane globalne pakiety witryn, będziesz miał kłopoty. Tak myślałem.
theStud54
1

To działało dla mnie: Top Menu -> File -> Invalidate Caches/Restart

Gershon Herczeg
źródło
0

Wykonano w PyCharm 2019.3.1 Kliknij prawym przyciskiem myszy folder src -> „Oznacz katalog jako” -> Kliknij „Wyłączone”, a folder src powinien być niebieski.

Burhan U Din
źródło
-1

Pycharm używa venv. W konsoli venv powinieneś zainstalować pakiety jawnie lub wejść settings -> project interpreter -> add interpreter -> inherit global site-packages.

yunus
źródło
-1

W nowszych wersjach pycharm możesz to zrobić, klikając prawym przyciskiem myszy katalog lub pakiet Pythona, z którego chcesz zaimportować plik, a następnie kliknij „Oznacz katalog jako” -> „Źródłowy katalog główny”

Shravan Kumar
źródło
-1

Najłatwiej to naprawić, wykonując następujące czynności w oprogramowaniu pyCharm:

Kliknij: Plik> Ustawienia> (Projekt: nazwa twojego projektu)> Interpreter projektu>

następnie kliknij ikonę „+” po prawej stronie, aby wyszukać żądany pakiet i zainstalować go.

Miłego kodowania !!!

zaid.mohammed
źródło
1
Witamy w Stack Overflow i dziękuję za odpowiedź. Chociaż może to być poprawne, w przyszłości unikaj publikowania zdjęć lub linków do innych stron bez kontekstu lub innych szczegółów. Link może w pewnym momencie przestać działać, przez co ta odpowiedź będzie mniej przydatna dla innych użytkowników.
CyberJacob
@CyberJacob Dziękuję bardzo i bardzo dziękuję za radę, zredagowałem odpowiedź, usuwając obraz i dodając tekst.
zaid.mohammed