Ho pubblicato una risposta simile anche alla domanda relativa alle importazioni da pacchetti di pari livello. Puoi vederlo qui .
Soluzione senza sys.pathhack
Sommario
- Avvolgere il codice in una cartella (ad es.
packaged_stuff)
- Usa lo
setup.pyscript di creazione in cui usi setuptools.setup () .
- Pip installa il pacchetto in stato modificabile con
pip install -e <myproject_folder>
- Importa utilizzando
from packaged_stuff.modulename import function_name
Impostare
Presumo la stessa struttura di cartelle della domanda
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
Chiamo la .cartella principale e nel mio caso si trova in C:\tmp\test_imports.
passi
1) Aggiungi setup.pya alla cartella principale
Il contenuto di setup.pypuò essere semplicemente
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Fondamentalmente "qualsiasi" setup.pyavrebbe funzionato. Questo è solo un esempio minimo di lavoro.
2) Utilizzare un ambiente virtuale
Se hai familiarità con gli ambienti virtuali, attivane uno e vai al passaggio successivo. L'uso di ambienti virtuali non è assolutamente necessario, ma ti aiuteranno davvero a lungo termine (quando hai in corso più di 1 progetto ...). I passaggi più basilari sono (esegui nella cartella principale)
- Crea un ambiente virtuale
- Attiva env virtuale
. /venv/bin/activate(Linux) o ./venv/Scripts/activate(Win)
Per saperne di più su questo, basta Google "tutorial Python virtualenv" o simili. Probabilmente non avrai mai bisogno di altri comandi oltre a creare, attivare e disattivare.
Dopo aver creato e attivato un ambiente virtuale, la console dovrebbe fornire il nome dell'ambiente virtuale tra parentesi
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 installa il tuo progetto in stato modificabile
Installa il tuo pacchetto di livello superiore myprojectutilizzando pip. Il trucco è usare la -ebandiera durante l'installazione. In questo modo viene installato in uno stato modificabile e tutte le modifiche apportate ai file .py verranno automaticamente incluse nel pacchetto installato.
Nella directory principale, eseguire
pip install -e . (notare il punto, sta per "directory corrente")
Puoi anche vedere che è installato usando 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) Importa anteponendo mainfolderad ogni importazione
In questo esempio, mainfoldersarebbe ptdraft. Ciò ha il vantaggio di non incorrere in collisioni di nomi con altri nomi di moduli (dalla libreria standard di Python o da moduli di terze parti).
Esempio di utilizzo
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()
Running life.py
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!