Mam taką strukturę plików:
Folder
Common
foo1.py
TestFolder
foo2.py
Chcę zaimportować do foo2.py
i foo1.py
. Próbowałem, ale nie działa na Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
Mam taką strukturę plików:
Folder
Common
foo1.py
TestFolder
foo2.py
Chcę zaimportować do foo2.py
i foo1.py
. Próbowałem, ale nie działa na Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
Odpowiedzi:
Jak Python znajduje swoje moduły
Ściśle biorąc, moduł jest pojedynczym plikiem Pythona, podczas gdy pakiet jest folderem zawierającym pliki Pythona, któremu towarzyszy plik (może być pusty) o nazwie __init__.py
, który informuje Pythona, że jest to pakiet do importowania modułów. W obu przypadkach moduły wymagają .py
rozszerzenia, ale importowanie odbywa się bez (patrz dalej poniżej).
Domyślnie Python szuka modułów i pakietów w $PYTHONPATH
.
Aby dowiedzieć się, co zawiera $ PYTHONPATH, uruchom następujący kod w python (3):
import sys
print(sys.path)
Jak dodać katalog
Sporadycznie
Z poziomu pliku Pythona możesz od czasu do czasu dodawać ścieżki do ścieżki domyślnej, dodając następujące wiersze w sekcji head aplikacji lub skryptu Python:
import sys
sys.path.insert(0, "/path/to/your/package_or_module")
Na przykład:
jeśli mam folder: /home/myname/pythonfiles
i chcę zaimportować plik module_1.py
znajdujący się w tym katalogu, dodaję go do sekcji head mojego kodu:
import sys
sys.path.insert(0, "/home/myname/pythonfiles")
I mogę po prostu zaimportować plik module_1.py
przez:
import module_1
Kiedy tworzę pakiet i chcę zaimportować moduły z pakietu, muszę utworzyć folder $PYTHONPATH
zawierający moduły, któremu towarzyszy (może być pusty) plik o nazwie__init__.py
Na przykład:
Importować z pakietu (folderu), zwanego my_package
w /home/myname/pythonfiles
, dodać /home/myname/pythonfiles
ścieżkę do Twojego $PYTHONPATH
, jak w przykładzie 1, a następnie zaimportować moduł o nazwie module_2.py
(wewnątrz folderu pakietu) po prostu z: `
from <packagename> import module_2
Dodawanie katalogów na $PYTHONPATH
stałe:
Dodaj następujący wiersz do ~/.profile
pliku.
export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add
Podkatalogi
Z poziomu pakietu podkatalogi nie są tak uwzględnione; musisz „połączyć” katalogi. Aby zaimportować moduł module_3.py
, wewnątrz folderu subfolder
w folderze packagename
:
import packagename.subfolder.module_3
Biorąc pod uwagę fakt, że wszystkie podfoldery w pakiecie zawierają własny __init__.py
plik.
Gdy moduł znajduje się w tym samym katalogu co skrypt lub aplikacja
Nie ma potrzeby wstawiania ścieżki do modułu, gdy znajduje się on w tym samym katalogu co skrypt lub aplikacja, jest on automatycznie dodawany.
Przykład:
Jeśli mam folder zawierający script.py
i module.py
, mogę po prostu zaimportować moduł poprzez:
import module
printenv PYTHONPATH
nic
sys.path.append("/path/to/your/package_or_module")
dodaje również ścieżkę do wartości domyślnej i jest mniej myląca. W porównaniu z sys.path.insert(0,...)
tym ma 0
jako pierwszy argument.
Prawidłowy sposób użycia importu względnego to:
from ..Common import foo1
I potrzebujesz również __init__.py
we wszystkich swoich folderach.
Uwaga: Ta odpowiedź jest nieaktualna dla najnowszej wersji Pythona 3, ale jest dostępna dla wcześniejszej wersji. Aby uzyskać więcej informacji, przeczytaj komentarze i https://www.python.org/dev/peps/pep-0420/
Zasadniczo każdy folder z kodem python, który chcesz dodać do ścieżki syspath, potrzebuje pliku __init__.py. Te pliki __init__.py mogą być puste.
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
tutaj jest także odpowiednia dokumentacja, PEP 420, która opisuje dodanie semantyki pakietu przestrzeni nazw
__init__.py
plik w swoim folderze? w ten sposób Python tworzy pakiety i pozwala importować moduły z tego pakietu. guide.python-distribute.org/creation.html