2012-02-17 19 views
7

Il nostro è un negozio di python. Disponiamo di diversi pacchetti python sviluppati internamente e verranno implementati negli ambienti dei clienti (macchine).Quali sono le migliori pratiche per la creazione di distribuzioni Python (uova) su (e per) più sistemi operativi

Ecco come avviene il nostro ciclo di sviluppo e rilascio.

Una volta che gli sviluppatori hanno completato il "test" di un pacchetto, una distribuzione (file egg) del pacchetto viene preparata e trasferita in un archivio centrale. Quando vogliamo distribuire il nostro software ai clienti, le stesse distribuzioni (file egg) verranno scaricate e installate nel loro ambiente.

Supponendo che il "test" si verifichi su più sistemi operativi (per verificare la compatibilità dell'API su più piattaforme), qual è la procedura migliore per preparare le distribuzioni ed essere trasferiti al centro di archiviazione centrale.

È meglio disporre di uova specifiche del sistema operativo sul server di archiviazione (come, samplepkg-1.0.0.win32.egg e samplepkg-1.0.0.linux.egg? Non so come possano essere preparati in questo modo usando setuptools.) Oppure hai un singolo uovo perché l'API rimane uguale su tutte le piattaforme? Qualche altra pratica che è seguita dalla comunità?

risposta

5

È possibile utilizzare un unico pacchetto se:

  1. Il pacchetto non usare le funzioni/classi che non sono disponibili su tutti i tuoi piattaforme di destinazione (si veda ad esempio i capitoli 36-39 del riferimento libreria standard di Python per la versione 2.7.2 per cose che non dovresti usare in quel caso)
  2. Non stai usando estensioni scritte in C/C++ che devono essere compilate per ogni piattaforma.

È consigliabile evitare le funzioni specifiche del sistema operativo che non sono disponibili su tutte le piattaforme di destinazione. La libreria standard è abbastanza ben documentata a tale riguardo.

2

Penso che in questo caso, l'utilizzo di un singolo pacchetto sarebbe più complicato a causa dei motivi che Roland ha menzionato sopra. Nel tuo ambiente di sviluppo potresti avere cartelle separate per piattaforme separate, ciascuna con il codice specifico della piattaforma (come le estensioni/librerie scritte in C/C++). Dovresti imitare i tuoi setuptools all'interno di queste cartelle per produrre uova separate, ma alla fine sarebbe meno complesso (credo, senza sapere di più su quale codice stai effettivamente lavorando) che provare a mettere tutto in un unico pacchetto.

In entrambi i casi, la lettura della documentazione sulla libreria standard e le distutils (http://docs.python.org/distutils/) dovrebbero aiutare a trovare la soluzione.

1

Le uova specifiche per piattaforma sono destinate esclusivamente alla distribuzione di colli contenenti codice C; altrimenti i file egg stessi sono indipendenti dalla piattaforma e devi solo distribuire un uovo indipendente dalla piattaforma.

Se si utilizzano gli strumenti di installazione automatica o le API di runtime di pkg_resources per trovare librerie e plug-in, è possibile scaricare tutte le uova in un'unica directory e lo strumento di installazione o l'API di runtime selezionerà l'uovo da installare o importare a partire dal.

tl; versione dr: il modo in cui setuptools crea le uova è il modo in cui dovrebbero essere distribuite; se si tenta di creare un uovo multipiattaforma in una piattaforma dipendente o viceversa, è probabile che si verifichi un po 'di dolore.;-)

0

Se si dispone solo di moduli python, mantenere la differenza nascosta in python, gli stessi file (python std lib) o file separati (pyserial).

Se si sono compilati moduli, è un po 'più complicato.

Io uso la seguente struttura di directory per un progetto che ha bisogno compilato estensione:

./lib/display.py # frontend, platform-independent 
./lib.linux-x86_64-2.6/_display.so 
./lib.linux-armv5tejl-2.6/_display.so 

E questo codice all'inizio del l'inizio del programma:

sys.path.append("lib.%s-%s-%s.%s" % ((posix.uname()[0].lower(), 
             posix.uname()[4]) 
            +sys.version_info[:2])) 

si può avvolgere struttura come anche in un file .egg, purché si specifichi che non è protetto da zip.