To pierwszy raz, kiedy naprawdę usiadłem i wypróbowałem Python 3 i wydaje mi się, że zawodzi. Mam następujące dwa pliki:
- test.py
- config.py
config.py ma zdefiniowane w nim kilka funkcji, a także kilka zmiennych. Ograniczyłem to do następujących:
config.py
debug = True
test.py
import config
print (config.debug)
Mam też __init__.py
Jednak pojawia się następujący błąd:
ModuleNotFoundError: No module named 'config'
Zdaję sobie sprawę, że konwencja py3 zakłada import bezwzględny:
from . import config
Prowadzi to jednak do następującego błędu:
ImportError: cannot import name 'config'
Więc nie wiem, co robić tutaj ... Każda pomoc jest bardzo mile widziana. :)
python
python-3.x
package
python-import
relative-import
blitzmann
źródło
źródło
python test.py
, i działa doskonale. Nie mam pyCharm, ale być może jest to zła konfiguracja pyCharm, która powoduje problemOdpowiedzi:
TL; DR: nie można zrobić import względne z pliku, który wykonania ponieważ
__main__
moduł nie jest częścią pakietu.Import bezwzględny - zaimportuj coś, co jest dostępne na
sys.path
Importy względne - zaimportuj coś odnoszącego się do bieżącego modułu, musi być częścią pakietu
Jeśli uruchamiasz oba warianty dokładnie w ten sam sposób, jeden z nich powinien działać. W każdym razie, oto przykład, który powinien pomóc ci zrozumieć, co się dzieje, dodajmy kolejny
main.py
plik z ogólną strukturą katalogów, taką jak ta:Zaktualizujmy test.py, aby zobaczyć, co się dzieje:
Najpierw uruchommy test.py:
Tutaj „test” to plik
__main__
moduł i wie nic o przynależności do pakietu nie wiem.import config
Powinno jednak działać, ponieważryan
folder zostanie dodany do sys.path.Zamiast tego uruchommy main.py:
A tutaj test znajduje się w pakiecie "ryan" i może wykonywać import względny.
import config
kończy się niepowodzeniem, ponieważ niejawne importy względne nie są dozwolone w Pythonie 3.Mam nadzieję, że to pomogło.
PS: jeśli trzymasz się Pythona 3,
__init__.py
pliki nie są już potrzebne .źródło
sys.path.append('/some/path/my_module')
środka/some/path/my_module/__init__.py
?sys.path
czasie wykonywania jest dość powszechne ( github.com/ ... ). Możesz także ustawić zmienną środowiskową PYTHONPATH.__init__.py
pliki nie są już potrzebne ”. Ciekawy. Czy możesz to rozwinąć? Miałem wrażenie, że mechanizm rozwiązywania pakietów nie zmienił się aż tak bardzo między 2 a 3__init__.py
pliki nie są już potrzebne ”. I odwrotnie, czy możesz opisać rzeczy, jeśli chcemy, aby pakiet działał zarówno w 2, jak i 3? I zobacz żałośnie nieaktualny rok 2009 Do czego służy__init__.py
? i najbardziej popularna odpowiedź: „Jest to część pakietu” . Musimy zacząć podkreślać rozróżnienie „zwykły pakiet [stary, przed 3.3]” a „pakiet przestrzeni nazw [3.3+]” wszędzie i często.Rozgryzłem to. Bardzo frustrujące, zwłaszcza pochodzące z pythona2.
Musisz dodać
.
do modułu, niezależnie od tego, czy jest względne, czy bezwzględne.Utworzyłem konfigurację katalogu w następujący sposób.
modx.py
mody.py
main.py
kiedy wykonuję main, tak się dzieje
Uruchomiłem 2to3, a podstawowe wyjście było takie
Musiałem zmodyfikować instrukcję importu mody.py, aby to naprawić
Następnie ponownie uruchomiłem main.py i uzyskałem oczekiwany wynik
Na koniec wystarczy go wyczyścić i uczynić przenośnym między 2 a 3.
źródło
try/except
procedura ładowania jest prawdziwym składnikiem, który tutaj działa (ponieważ niektórzy będą musieli używaćtry:scripts.modx
iexcept: modx
), i to właśnie rozwiązało ten problem.Ustawienie PYTHONPATH również może pomóc w rozwiązaniu tego problemu.
Oto, jak można to zrobić w systemie Windows
set PYTHONPATH=.
źródło
Musisz dołączyć ścieżkę do modułu do
PYTHONPATH
.W przypadku systemu UNIX (Linux, OSX, ...)
Dla Windowsa
źródło
Próbowałem twojego przykładu
To zadziała dla mnie:
Przetestowano w Pythonie: 3.4.2 - PyCharm 2016.3.2
Oprócz tego PyCharm oferuje import tej nazwy .
Musisz kliknąć
config
i pojawi się ikona pomocy .źródło
Możesz po prostu dodać następujący plik do katalogu testing, a następnie Python uruchomi go przed testami
źródło
Ustaw
PYTHONPATH
zmienną środowiskową w głównym katalogu projektu.Biorąc pod uwagę system UNIX:
źródło
Ten przykład działa na Pythonie 3.6.
Proponuję pójść
Run -> Edit Configurations
PyCharm, usunąć tam wszystkie wpisy i spróbować ponownie uruchomić kod przez PyCharm.Jeśli to nie zadziała, sprawdź interpreter projektu (Ustawienia -> Interpreter projektu) i uruchom ustawienia domyślne (Uruchom -> Edytuj konfiguracje ...).
źródło
Zadeklaruj poprawną listę sys.path przed wywołaniem modułu:
źródło
Jak stwierdzono w komentarzach do oryginalnego postu, wydawało się, że jest to problem z interpretatorem języka Python, którego używałem z dowolnego powodu, a nie coś złego ze skryptami Pythona. Przerzuciłem się z pakietu WinPython na oficjalny Python 3.6 z python.org i wszystko działało dobrze. dzięki za pomoc wszystkim :)
źródło
Jeśli używasz Pythona 3+, spróbuj dodać poniższe wiersze
źródło
Próbować
To, co to robi, to importowanie z tego samego poziomu folderu. Jeśli spróbujesz bezpośrednio zaimportować, zakłada się, że jest to podwładny
źródło