Uruchamianie modułów wewnątrz paczki w postaci plików wykonywalnych to zła praktyka .
Kiedy coś tworzysz, budujesz bibliotekę, która ma być importowana przez inne programy, a zatem nie ma sensu pozwalać na bezpośrednie wykonywanie jej submodułów lub budujesz plik wykonywalny, w którym to przypadku nie ma powodu aby uczynić go częścią pakietu.
To dlatego w setup.py
można rozróżnić pakiety i skrypty. Pakiety zostaną objęte pod site-packages
, a skrypty zostaną zainstalowane pod /usr/bin
(lub podobnym miejscem w zależności od systemu operacyjnego).
Moja rekomendacja jest więc używać następujący układ:
/
├── mydirectory
| ├── __init__.py
| ├── file1.py
└── file2.py
Gdzie file2.py
import file1.py
jak każdy inny kod, który chce korzystać z biblioteki mydirectory
, wybitnych absolutnego importu:
from mydirectory.file1 import f
Podczas pisania skryptu setup.py
dla projektu wystarczy wpisać mydirectory
jako pakiet i file2.py
jako scenariusz i wszystko będzie działać. Nie musisz się bawić z sys.path
.
Jeśli kiedykolwiek, z jakiegoś powodu, naprawdę chcesz faktycznie uruchomić podmodułu pakietu, właściwy sposób to zrobić jest użycie przełącznika -m
:
python -m mydirectory.file1
Ten ładuje cały pakiet, a następnie wykonuje moduł jako skrypt, umożliwiając powodzenie względnego importu.
Osobiście uniknę tego. Również dlatego, że wiele osób nawet nie wie, że możesz to zrobić i skończy się otrzymaniem tego samego błędu co Ty i myślisz, że pakiet jest zepsuty.
chodzi aktualnie akceptowanych odpowiedź, która mówi, że należy po prostu użyć niejawna względną importu from file1 import f
bo to będzie działać, ponieważ są one w tym samym katalogu:
To źle!
- Będzie nie praca w python3 gdzie ukryte import względne są niedozwolone i będą na pewno przerwać, jeśli zdarzy ci się mieć zainstalowany moduł
file1
(ponieważ zostanie on importowany zamiast modułu!).
Nawet jeśli zadziała, file1
nie będzie widoczny jako część pakietu mydirectory
. Ten numer może być ważny pod numerem.
Na przykład, jeśli file1
używa pickle
, nazwa pakietu jest ważna dla prawidłowego załadowania/rozładowania danych.
Czy używasz 'file2.py' bezpośrednio? – Blender
Tak, robię: 'python3 file2.py' z poziomu wiersza poleceń –
Jeśli moduł Pythona jest częścią pakietu, * nie powinieneś * uruchamiać go jako głównego. Jeśli rozpowszechnisz swoją bibliotekę, pakiety przejdą do 'site-packages', ale skrypty powinny przejść do'/usr/bin' lub czegoś podobnego (stąd potrzeba bezwzględnego importu). Powinno istnieć wyraźne rozróżnienie między modułem Pythona, który został napisany do wykonania, a modułem zapisanym jako część biblioteki. – Bakuriu