Ho discusso questa domanda internamente per alcune settimane e continuo a trovare una buona risposta alla domanda. Sento che un esempio sarebbe più descrittivo del solo parlarne, quindi inizierò con quello.
Ho un repository di progetti Python strutturato come segue:
.
├── common_package
│ ├── __init__.py
│ └── other files and folders...
│
├── package_one
| ├── src
│ | ├── common_package -> ../common_package
│ │ └── package_one
│ │ ├── __init__.py
│ │ └── other files and folders...
│ ├── tests
│ │ └── ...
│ ├── README.md
│ ├── setup.cfg
│ └── setup.py
│
├── package_two
| ├── src
│ | ├── common_package -> ../common_package
│ │ └── package_two
│ │ ├── __init__.py
│ │ └── other files and folders...
│ ├── tests
│ │ └── ...
│ ├── README.md
│ ├── setup.cfg
│ └── setup.py
│
└── other packages with common_package...
Ciascuno di package_one
, package_two
, ecc. è un pacchetto Python separato con le sue dipendenze (molto variabili e abbastanza grandi), il processo di compilazione e le distribuzioni. Tuttavia, tutti questi pacchetti implementano (in una forma o in un'altra) cose in common_package
che fornisce un'interfaccia comune ai diversi pacchetti per la concorrenza in futuro. I pacchetti sono completamente disgiunti diversi da quello (salvo un sistema di risorse gestito da common_package
).
Alcuni pacchetti sono abbastanza piccoli (pochi file ciascuno), quindi non garantiscono un repository separato per ciascuno; anche perché le loro dipendenze variano un bel po 'e le tecniche sono molto disgiunte (e non c'è alcun uso per nessun pacchetto in nessun altro pacchetto), non penso che sarebbe saggio comprimerle tutte sotto un setup.py
ombrello.
Ho trovato questa tecnica molto utile e pratica, con un avvertimento: dopo aver installato un pacchetto, ora ho common_package
come un pacchetto accessibile e importabile da qualsiasi parte del mio ambiente virtuale. Temo che questo generi cattive notizie dal momento che il nome del pacchetto è molto generico (nella mia implementazione è solo common
), e potrebbe essere sovrascritto.
Ad esempio, questo è il modo in cui un codice si occuperà di installare package_one
.
>>> from common_package import config
>>> from package_one import some_module
>>> some_module.do_stuff(config.SOME_PATH)
Quindi la mia domanda è la seguente: c'è un modo per migliorare questa struttura? In particolare, posso incapsulare qualcuno di tutti questi sotto-pacchetti in uno "spazio dei nomi", come project_name
senza averli sotto un unico pacchetto che deve essere installato nello stesso momento?