In generale, se il progetto Python contiene più pacchetti nativi per il progetto, è probabile che ci sia probabilmente un unico pacchetto di livello superiore che tutti gli altri pacchetti sono sottoinsiemi di (dopotutto fanno parte dello stesso progetto quindi ci dovrebbe essere qualche giustificazione unificante per la loro esistenza). Dal momento che una directory conta come un pacchetto solo quando ha un __init__.py
, l'altro modo per dire questo è che se due directory di pari livello nel tuo progetto hanno entrambi uno __init__.py
, allora anche il loro genitore dovrebbe averne uno. Quindi, supponendo che abbiate buoni motivi per avere un pacchetto "scripts" e un pacchetto "modules" direttamente all'interno della root del progetto, cosa che potreste avere, la directory root del progetto probabilmente dovrebbe essere anche un pacchetto.
Se il pacchetto di livello superiore non è la radice del progetto, di solito è considerato opportuno disporre di alcuni script Python "liberi" adiacenti al pacchetto di livello superiore. Come questo:
project_root/
top_level_package/
__init__.py
module.py
subpackage/
__init__.py
anothermodule.py
adjacent_script.py
adjacent_script_2.py
Gli script "sciolti" in grado di importare direttamente dai pacchetti e moduli, perché sono nella stessa directory come il pacchetto di livello superiore.L'ipotesi con questa costruzione è che il pacchetto di livello superiore contenga tutto il codice "interessante" del tuo progetto (il tuo "punto di vendita", o la "carne" del tuo progetto, se lo desideri), mentre gli script "liberi" adiacenti funzionano solo come punti di accesso a funzionalità specifiche a cui si potrebbe voler accedere dal pacchetto di livello superiore. Ad esempio, potresti avere uno script adiacente per avviare la suite di test, per installare il software o per avviare l'applicazione se il tuo progetto è un'applicazione.
Per quanto riguarda il vostro modello particolare, ho l'impressione che si distinguano gli "script" da "moduli" perché gli script sono intesi come un'interfaccia tra te e i moduli. Se è solo per tu come uno sviluppatore e stai usando gli "script" raramente, come hai detto, probabilmente è meglio attenersi alla tua ricetta finché la directory root ha un __init__.py
. Se, tuttavia, tu (o qualcun altro) usi anche gli "script" come utente finale, o se li usi frequentemente, è più semplice fornire uno script adiacente al pacchetto di livello superiore che metta in bundle la funzionalità dal tuo directory "scripts" in un singolo comando (o forse alcuni se offrono funzionalità molto dissimili) con un sottocomando per ogni "script". Potresti voler usare il modulo standard argparse per quello script adiacente. In entrambi i casi, sarebbe probabilmente più appropriato chiamare gli "script" strumenti.
Se si dispone solo di alcuni strumenti e non contengono alcun codice diverso dalla colla tra la riga di comando e i moduli, è possibile anche considerare di spostarli nella directory superiore.
Alcune fonti:
È possibile che qualcuno importi un modulo di script e ne invochi manualmente alcune parti? – Kos
@Kos possibile, ma perché? Voglio solo avere alcuni script Python regolari che eseguono attività una tantum. Avere persone importare parti altrove sembra eccessivo. – Eli