Sto scrivendo una famiglia di script Python all'interno di un progetto; ogni script è all'interno di una sottodirectory del progetto, in questo modo:Python: condivisione di codice comune tra una famiglia di script
projectroot
|
|- subproject1
| |
| |- script1.main.py
| `- script1.merger.py
|
|- subproject2
| |
| |- script2.main.py
| |- script2.matcher.py
| `- script2.merger.py
|
`- subproject3
|
|- script3.main.py
|- script3.converter.py
|- script3.matcher.py
`- script3.merger.py
Ora molti degli script condividono un certo codice. Il codice condiviso è considerato come parte del progetto stesso, e non qualcosa che vorrei compilare separatamente e creare una libreria, o inserire un PYTHONPATH in tutto il sito. Potrei inserire quel codice in vari punti, come nella stessa directory projectroot
o in una directory secondaria di projectroot
chiamata common
(forse).
Tuttavia, la maggior parte dei modi che ho pensato finora implicano la realizzazione di pacchetti di fuori delle mie sottoprogetti con vuoto __init__.py
file o usare le importazioni relative (o ridondante scherzi con sys.path
in ogni sottoprogetto. Peggio ancora, sembra che la costruzione di una struttura del pacchetto intorno a questa famiglia di script viene eseguito in conflitto con il seguente avviso dal respinto PEP-3122:
Attention! This PEP has been rejected. Guido views running scripts within a package as an anti-pattern.
Se gli script all'interno di un pacchetto è anti-patternish, come posso impostare le cose in un modo che mantiene il codice comune nella stessa progetto? O è accettabile un modulo e un sistema basato su pacchetti? Qual è l'approccio più pulito? (FWIW preferirei t o avere un file come shared.py
o common.py
nella directory radice del progetto, piuttosto che fare una directory di utilità che è un fratello per i sottoprogetti "reali".)
credo che django usi un punto di accesso centralizzato 'manage.py' per eseguire tutti i suoi script. Fare qualcosa del genere potrebbe consentire di trasformare il 'subprojectX' in pacchetti e gestire l'importazione centralizzata all'interno dello script" 'manage.py'" (entry point). Come pacchetti, credo, sarà facile supportare un modulo 'comune' in cui la vostra funzionalità condivisa potrebbe vivere. – dm03514
Credo che dovrebbe essere [PEP-3122] (https://www.python.org/dev/peps/pep-3122/), non PEP-32122. – user1071847