Mam folder na mój kod klienta, folder na mój kod serwera i folder na kod, który jest między nimi współdzielony
Proj/
Client/
Client.py
Server/
Server.py
Common/
__init__.py
Common.py
Jak zaimportować Common.py z Server.py i Client.py?
Odpowiedzi:
EDYCJA listopad 2014 (3 lata później):
Python 2.6 i 3.x obsługuje prawidłowe importowanie względne, dzięki czemu można uniknąć robienia czegokolwiek hakerskiego. Dzięki tej metodzie wiesz, że otrzymujesz import względny, a nie bezwzględny . „..” oznacza, przejdź do katalogu nad mną:
Uwaga: zadziała to tylko wtedy, gdy uruchomisz Pythona jako moduł spoza pakietu. Na przykład:
Oryginalny hacky sposób
Możesz dodać Common / do swojego sys.path (lista ścieżek, na które Python patrzy, aby importować rzeczy):
os.path.dirname(__file__)
po prostu podaje katalog, w którym znajduje się twój bieżący plik Pythona, a następnie przechodzimy do katalogu „Common /” i importujemy moduł „Common”.źródło
from ...myfile
idzie do../../myfile
Zabawne, ten sam problem, który właśnie spotkałem, i otrzymuję tę pracę w następujący sposób:
łącząc z poleceniem linux
ln
, możemy bardzo uprościć sprawę:A teraz, jeśli chcesz importować
some_stuff
z pliku:Proj/Common/Common.py
do swojego pliku:,Proj/Client/Client.py
tak jak to:I to samo dotyczy
Proj/Server
, Działa również dlasetup.py
procesu, to samo pytanie omówione tutaj , mam nadzieję, że pomoże!źródło
Nie rób importu względnego.
Z PEP8 :
Umieść cały kod w jednym super pakiecie (np. „Myapp”) i używaj podpakietów dla klienta, serwera i wspólnego kodu.
Aktualizacja: „ Python 2.6 i 3.x obsługuje prawidłowe importowanie względne (...) ”. Zobacz odpowiedzi Dave'a, aby uzyskać więcej informacji.
źródło
if __name__ == "__main__":
wierszu „ ”. Oznacza to, że chcesz móc ich używać jako samodzielnych skryptów. Jak to zrobić poprawnie? Myślę, że jest to bardzo powszechny przypadek użycia, który powinien być obsługiwany. Dlaczego jest to odradzane?Wykonanie względnego importu jest absolutnie OK! Oto, co robi mały 'ol me:
źródło
__file__
do uzyskania właściwej relacji z bieżącego plikuDomyślna metoda importu jest już „względna” i pochodzi z PYTHONPATH. PYTHONPATH jest domyślnie przypisywana do niektórych bibliotek systemowych wraz z folderem oryginalnego pliku źródłowego. Jeśli uruchomisz z -m, aby uruchomić moduł, bieżący katalog zostanie dodany do PYTHONPATH. Więc jeśli punkt wejścia twojego programu znajduje się wewnątrz Proj, użyj
import Common.Common
powinno działać zarówno wewnątrz Server.py, jak i Client.py.Nie rób względnego importu. Nie będzie działać tak, jak chcesz.
źródło