Podałem podobną odpowiedź również na pytanie dotyczące importu z opakowań rodzeństwa. Możesz to zobaczyć tutaj .
Rozwiązanie bez sys.path
włamań
Podsumowanie
- Zawiń kod w jeden folder (np.
packaged_stuff
)
- Użyj
setup.py
skryptu tworzenia, w którym używasz setuptools.setup () .
- Pip zainstaluj pakiet w stanie edytowalnym za pomocą
pip install -e <myproject_folder>
- Importuj za pomocą
from packaged_stuff.modulename import function_name
Ustawiać
Zakładam taką samą strukturę folderów jak w pytaniu
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
Dzwonię do .
folderu głównego, aw moim przypadku znajduje się w C:\tmp\test_imports
.
Kroki
1) Dodaj a setup.py
do folderu głównego
Zawartość setup.py
może być po prostu
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Zasadniczo „każdy” setup.py
działałby. To tylko minimalny działający przykład.
2) Użyj środowiska wirtualnego
Jeśli znasz środowiska wirtualne, aktywuj jedno i przejdź do następnego kroku. Korzystanie ze środowisk wirtualnych nie jest absolutnie wymagane, ale naprawdę pomoże ci w dłuższej perspektywie (jeśli masz więcej niż jeden projekt w toku ..). Najbardziej podstawowe kroki to (uruchom w folderze głównym)
- Utwórz wirtualne środowisko
- Aktywuj środowisko wirtualne
. /venv/bin/activate
(Linux) lub ./venv/Scripts/activate
(Win)
Aby dowiedzieć się więcej na ten temat, po prostu wypróbuj Google „tutorial python virtualenv” lub podobny. Prawdopodobnie nigdy nie potrzebujesz żadnych innych poleceń niż tworzenie, aktywowanie i dezaktywowanie.
Po utworzeniu i aktywacji środowiska wirtualnego konsola powinna podać nazwę środowiska wirtualnego w nawiasie
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3) pip zainstaluj swój projekt w stanie edytowalnym
Zainstaluj pakiet najwyższego poziomu myproject
za pomocą pip
. Sztuką jest użycie -e
flagi podczas instalacji. W ten sposób jest on instalowany w stanie edytowalnym, a wszystkie zmiany dokonane w plikach .py zostaną automatycznie uwzględnione w zainstalowanym pakiecie.
W katalogu głównym uruchom
pip install -e .
(zwróć uwagę na kropkę, oznacza „bieżący katalog”)
Możesz również zobaczyć, że jest on instalowany przy użyciu pip freeze
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4) Importuj, dodając mainfolder
do każdego importu
W tym przykładzie mainfolder
byłoby ptdraft
. Ma to tę zaletę, że nie spotkasz się z kolizjami nazw z innymi nazwami modułów (z biblioteki standardowej Python lub modułów innych firm).
Przykładowe użycie
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
Uruchamianie life.py
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!