Ho pubblicato una risposta simile anche alla domanda relativa alle importazioni da pacchetti di pari livello. Puoi vederlo qui .
Soluzione senza sys.path
hack
Sommario
- Avvolgere il codice in una cartella (ad es.
packaged_stuff
)
- Usa lo
setup.py
script 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.py
a alla cartella principale
Il contenuto di setup.py
può essere semplicemente
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Fondamentalmente "qualsiasi" setup.py
avrebbe 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 myproject
utilizzando pip
. Il trucco è usare la -e
bandiera 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 mainfolder
ad ogni importazione
In questo esempio, mainfolder
sarebbe 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!