2012-11-27 10 views
5

Non sono soddisfatto del modo in cui attualmente distribuisco il codice Python e mi chiedevo se c'è un modo migliore. Per prima cosa spiegherò cosa sto facendo, quindi gli svantaggi:Come distribuire e distribuire il codice Python 3 con isolamento delle dipendenze

  • Quando sviluppo, utilizzo virtualenv per isolare le dipendenze e installare tutte le librerie tramite pip. Lo stesso Python proviene dal mio sistema operativo (Ubuntu)
  • Poi ho creato il mio codice in un pacchetto debian ".deb" costituito dal mio albero di origine e un bundle di pip delle mie dipendenze
  • Poi quando lo distribuisco, ricostruisco l'ambiente virtualenv , fonte foo/bin/attivare e quindi eseguire il mio programma (sotto il parvenu di Ubuntu)

Qui ci sono i problemi:

  1. il bundle pip è abbastanza grande e aumenta la dimensione del pacchetto Debian in modo significativo. Questo non è un grosso problema, ma è fastidioso.
  2. Devo compilare tutte le librerie C (PyMongo, BCrypt, ecc.) Ogni volta che viene distribuito. Questo richiede un po 'di tempo (pochi minuti) ed è un po' inconsistente per fare questo lavoro CPU bound sulla produzione

qui sono i miei vincoli:

  1. deve lavorare su Python 3. Preferibilmente 3.2
  2. Deve avere isolamento dipendenza
  3. deve lavorare con le librerie che utilizzano C (come PyMongo)

ho sentito cose su di congelamento, ma non ho ape n in grado di farlo funzionare. cx_freeze di Pypi non sembra compilare (almeno sul mio Python). Le altre utilità di freeze non sembrano funzionare con Python 3. Come posso fare meglio?

risposta

1

Wheel è probabilmente il modo migliore per farlo al momento.

Creare una virtualenv sulla macchina di distribuzione e distribuire una ruota insieme a qualsiasi dipendenza (anch'essa costruita come ruote) su quella virtualenv.

Questo risolve i problemi:

  1. Avere ruote separate per le dipendenze significa che non è necessario ridistribuire le dipendenze che non sono cambiati, il taglio delle dimensioni del manufatto distribuzione
  2. costruire grandi pacchetti (come ad come lxml o SciPy) può essere fatto a livello locale, e quindi la ruota compilato spinto alla produzione

Inoltre, funziona benissimo con le librerie che utilizzano C.

0

Hai guardato a buildout (zc.buildout)? Con una ricetta personalizzata puoi essere in grado di automatizzare la maggior parte di questo.

+0

Questo è automatizzato - l'automazione non è un mio problema. Il mio problema è che è lento e richiede la compilazione in produzione –

+0

Hai guardato il pacchetto di distribuzione "ruota"? – sureshvv

+0

Wheel è ora in un punto in cui è utile per questo tipo di problema –

Problemi correlati