Come distribuire un'applicazione Python con le biblioteche come fonte senza ulteriori dipendenze?

StackOverflow https://stackoverflow.com/questions/527510

Domanda

Sfondo : Ho una piccola applicazione Python che rende la vita per gli sviluppatori che rilasciano il software nella nostra società un po 'più facile. I costruire un eseguibile per Windows utilizzando py2exe. L'applicazione nonché il binario vengono controllati in Subversion. Distribuzione avviene per persone semplicemente controllando la directory da SVN. Il programma ha circa 6 diverse biblioteche dipendenze Python (ad esempio elementtree, Mako)

La situazione : Gli sviluppatori vogliono incidere sulla fonte di questo strumento e quindi eseguirlo senza dover costruire il binario. Attualmente questo significa che hanno bisogno di un pitone 2.6 interprete (che va bene) e hanno anche i 6 librerie installate in locale utilizzando easy_install.

Il problema

  • Questo non è un pubblico, ambiente open source classica: Sono all'interno di una rete aziendale, lo strumento non potrà mai lasciare il "giardino murato" e noi abbiamo le barriere seriamente scomodo per arrivare a Internet al di fuori (NTLM autenticazione proxy e / o macchine senza accesso diretto a Internet).
  • Voglio gli ostacoli di iniziare a incidere su questo strumento per essere minimo: nessuno dovrebbe andare a caccia per la dipendenza destra nella versione destra, dovrebbero avere per eseguire il meno possibile l'installazione. In modo ottimale i prerequisiti sarebbe avere un'installazione Python e solo controllando il programma da Subversion.

Aneddoto : il più autonomo il processo è più facile è di ripeterlo. Ho avuto la mia macchina scambiato per uno nuovo e ha attraversato il processo sgradevole di dover decodificare le dipendenze, reinstallare distutils, caccia le librerie on-line e ottenere loro di installare (vedere le restrizioni su internet aziendale sopra).

È stato utile?

Soluzione

a volte io uso l'approccio che descrivo qui di seguito, per la stessa ragione per cui @Boris afferma: preferirei che l'uso di un codice è facile come a) svn checkout / aggiornamento - b) go

.

Ma per la cronaca:

  • Io uso virtualenv / easy_install maggior parte del tempo.
  • Sono d'accordo in una certa misura alle critisisms di @Ali A e @ S. Lott

In ogni caso, l'approccio che uso dipende dalla modifica sys.path, e funziona in questo modo:

  • Richiede Python e setuptools (per consentire il caricamento di codice da uova) su tutti i computer che utilizzeranno il software.
  • Organizza il tuo struttura di directory questo:
project/
    *.py
    scriptcustomize.py
    file.pth

    thirdparty/
        eggs/
            mako-vNNN.egg
            ... .egg
        code/
            elementtree\
                *.py
            ...
  • Nello script di alto livello (s) includere il seguente codice nella parte superiore:
from scriptcustomize import apply_pth_files
apply_pth_files(__file__)
  • Aggiungi scriptcustomize.py alla cartella del progetto:
import os
from glob import glob
import fileinput
import sys

def apply_pth_files(scriptfilename, at_beginning=False):
    """At the top of your script:
    from scriptcustomize import apply_pth_files
    apply_pth_files(__file__)

    """
    directory = os.path.dirname(scriptfilename)
    files = glob(os.path.join(directory, '*.pth'))
    if not files:
        return
    for line in fileinput.input(files):
        line = line.strip()
        if line and line[0] != '#':
            path = os.path.join(directory, line)
            if at_beginning:
                sys.path.insert(0, path)
            else:
                sys.path.append(path)
  • Aggiungi uno o più file * .pth (s) per la vostra cartella del progetto. Su ogni linea, mettere un riferimento a una directory con i pacchetti. Per esempio:
# contents of *.pth file
thirdparty/code
thirdparty/eggs/mako-vNNN.egg
  • I "tipo-di" come questo approccio. Quello che mi piace: è simile a come funzionano i file * .pth, ma per i singoli programmi, invece di tutta la vostra site-packages. Quello che non mi piace:. Dover aggiungere le due linee all'inizio degli script di primo livello
  • Anche in questo caso: io uso virtualenv maggior parte del tempo. Ma io tendo a usare virtualenv per progetti in cui ho stretto controllo della scenario di distribuzione. Nei casi in cui non ho stretto controllo, tendo a usare l'approccio che ho descritto sopra. Lo rende veramente facile da confezionare un progetto come una zip ed avere l'utente finale "install" esso (da decompressione).

Altri suggerimenti

Basta usare virtualenv - è uno strumento per creare ambienti Python isolati. È possibile creare uno script di set-up e distribuire l'intero gruppo, se si desidera.

"Cosa non mi piace il fatto che gli sviluppatori (o me iniziare su una nuova macchina pulita) devono passare attraverso le Distutils cerchi di dover installare le librerie a livello locale, prima di poter iniziare"

Perché?

Quello che - in particolare -? C'è di sbagliato in questo

L'avete fatto a creare il progetto. Il vostro progetto è in modo che altri popolari vogliono fare lo stesso.

Non vedo un problema. Si prega di aggiornare la tua domanda con problemi specifici avete bisogno risolto. Antipatia il modo in cui è distribuito l'open source non è un problema -. È il modo che l'open source funziona

Modifica . Il "giardino murato" non importa molto.

Scelta 1. Si potrebbe, BTW, costruire un ' "installazione" che corre easy_install 6 volte per loro.

Scelta 2. È possibile salvare tutti i kit di installazione che easy_install avrebbe usato. Poi si può fornire uno script che fa un decomprimere e un python setup.py install per tutti e sei.

Scelta 3. È possibile fornire una versione zippata del site-packages. Dopo l'installazione di Python, essi decomprimere la directory site-packages in `C:. \ Python2.5 \ lib \ site-packages``

La scelta 4. È possibile costruire il proprio kit di installazione MSI per il proprio ambiente di Python.

Scelta 5. È possibile ospitare il proprio server di PyPI-like e fornire un easy_install che controlla il server prima.

Sono d'accordo con le risposte di Nosklo e S. Lott. (+1 a entrambi)

Posso solo aggiungere che ciò che si vuole fare è in realtà un pessima idea .

Se si vuole veramente la gente a incidere sul vostro codice, avranno bisogno di una certa comprensione delle librerie coinvolte, come funzionano, cosa sono, da dove vengono, la documentazione per ogni ecc Certo fornire loro uno script di bootstrap , ma al di là che si sarà molly-attenzioni al punto che essi sono incapaci.

Poi ci sono questioni specifiche, come "che cosa succede se un utente vuole installare una versione diversa o l'attuazione di una biblioteca?", Un esempio lampante è qui elementtree, come questo ha un certo numero di implementazioni.

Non sto suggerendo che questa è una grande idea, ma di solito quello che faccio in situazioni come queste è che ho un Makefile, controllato in eversione, che contiene le regole fare per recuperare tutte le librerie dipendenti e installarli. Il makefile può essere abbastanza intelligente da applicare solo le librerie dipendenti se non sono presenti, quindi questo può essere relativamente veloce.

Un nuovo sviluppatore sul progetto controlla semplicemente fuori dalla sovversione e quindi tipi "make".

Questo approccio potrebbe funzionare bene per voi, dato che il pubblico è già utilizzato per l'idea di utilizzare casse sovversione come parte del loro processo di recupero. Inoltre, ha la bella proprietà che tutta la conoscenza sul vostro programma, comprese le sue dipendenze esterne, vengono catturati nel repository del codice sorgente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top