2011-12-15 2 views
8

Ho un piccolo programma in python che consiste in un file .py più una directory di file di dati usati dal programma.Script di installazione corretto per un piccolo programma Python (non modulo) sotto Linux

Vorrei conoscere il modo corretto di creare una procedura di installazione per un utente con diritti di amministratore su Linux in modo che possa installare il programma sul proprio sistema e utilizzarlo dalla riga di comando, con opzioni e parametri. EDIT: La parte in cui ho problemi è di avere il programma, una volta installato, recuperare i file di dati, contenuti in una sottocartella "dati".

Uno script di installazione che installa il file di programma eseguibile in /usr/local/bin e nella cartella dati in /usr/share/my_program/data può essere una soluzione accettabile? Qualcosa di simile:

#!/bin/bash 
# Launch with sudo 
chmod +x program.py 
cp program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation complete 

Ora, al fine di farlo, devo assumere, nel programma, che i file di dati stanno per essere in /usr/share/my_program/data. Ma lascerei anche all'utente la scelta di utilizzare il programma senza installarlo. Quindi dovrei assumere che i dati siano in './data', relativi al file di programma eseguibile. Come dovrei risolvere questo problema? Posso pensare ad alcuni modi, ma la mia sensazione è che sto creando un casino in cui dovrebbe esserci una risposta chiara e corretta.

Attualmente, sto considerando se usare una prova clausola except:

try: 
    find data from /usr/share/my_program && set path accordingly 
except: 
    set path to the data as './data' 

Anche in questo caso, mi sembra un po 'contorto. Come procederesti per l'installazione?

Molte grazie


EDIT: SOLUZIONE ADOTTATA

Sulla base delle risposte di questa domanda, e a quelli della domanda suggerita da FakeRainBrigand (How to know the path of the running script in Python?), ho creato uno script di installazione che Va in questo modo:

#!/bin/bash 
mkdir /usr/share/my_program 
chmod +x my_program.py 
cp my_program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation completed 

E aggiunto il seguente codice nel mio programma:

if os.path.dirname(__file__) == "/usr/local/bin": 
    DATA_PATH = "/usr/share/my_program/data" 
elif os.path.dirname(__file__) == ".": 
    DATA_PATH = "./data" 
else: 
    print "You do not have a working installation of my_program" 
    print "See the installation procedure in the README file" 
    sys.exit(1) 

Ho quindi utilizzare os.path.join(DATA_PATH, "file-to-reach.txt") modo che il programma possa raggiungere i propri dati, che si trova sotto /usr/share/my_program.

Sarei felice di avere commenti se è disponibile un metodo più accettato.

Acclamazioni

+0

'make' è molto più di un semplice C, ma potrebbe sembrare fuori luogo in un programma Python. – sarnold

risposta

11

Mi sbaglio che il metodo setup.py (ad esempio: python setup.py install), è solo per l'installazione dei moduli, per poi essere utilizzato all'interno di interprete o altri script?

Sì. Hai torto.

È possibile installare nella directory degli script di Python. Continua a leggere su tutte le cose che setup.py può fare. http://docs.python.org/distutils/setupscript.html#installing-scripts

Questo è in realtà molto, molto semplice. E non ha nulla a che fare con Python.

Uno script Python può essere eseguito da qualsiasi luogo. Linux offre una vasta gamma di modi per eseguire un file eseguibile() eseguibile.

Tutte queste ampie e ampie varietà di modi hanno tre cose in comune. Tre cose fondamentali per Linux e che non hanno niente a che vedere con Python.

  1. Il file deve essere sul PATH dell'utente.

  2. Il file deve disporre del privilegio "execute" (chmod +x ...).

  3. Il file deve iniziare con #!/usr/bin/env python.

Come si verifica?

Per # 1.

  • È possibile controllare il PERCORSO e inserire il file in una qualsiasi delle directory sul PERCORSO. Ci sono molte scelte standard per questo. /usr/local/bin, ad esempio.

  • È possibile modificare il PERCORSO dell'utente per includere una nuova directory. /path/to, ad esempio, in modo che sia possibile trovare .

Per # 2. Si esegue l'appropriato chmod +x.

Per # 3. Scrivi la riga di codice appropriata.

Per ulteriori informazioni leggere su "Linux Shell". Tutti i programmi "shell" hanno le stesse tre caratteristiche. bash. csh, python, perl, ecc, ecc, ecc


recuperare i file di dati, contenuti in una sottocartella 'dati', mentre riferendosi a loro come ./data/this_file.dat, per esempio.

Sarebbe un design scadente.

Linux (all'esterno di Python) offre molti modi per trovare file di dati utili.

  1. Installarli in una posizione nota con un percorso noto. Mi viene in mente /usr/local/share. Questo potrebbe non essere il posto migliore, ma è ragionevolmente popolare.

  2. Utilizzare le variabili di ambiente. MYAPP_HOME, ad esempio, può essere impostato sulla posizione del file. Puoi usare os.path.join(os.environ['MYAPP_HOME'], 'data', 'this_file.dat') Molto popolare.

  3. Utilizzare la variabile __file__ per scoprire dove si trova lo script.Quindi utilizzare os.path per individuare la directory e assemblare il percorso dei dati con os.path.join(this_directory, 'data', 'this_file.dat')

+0

Ciao S.Lott Grazie per il vostro consiglio. Sono a conoscenza dei tre passaggi che menzioni (percorso, bit eseguibile e shebang!). Tuttavia, usando questa conoscenza, non posso far funzionare il programma, sapendo che deve usare alcuni dei file nella sottocartella 'data'. Dal momento che attualmente non so dove l'utente metterà il programma, non posso 'hardcode' il percorso della cartella nel codice (che è comunque una pessima idea in ogni caso). Sto cercando un processo di installazione che consenta entrambi di trovare il file di programma nel percorso E di indicare i dati come: './data/this_file.dat'. Come dovrei procedere? – Morlock

+0

@Morlock: "Dal momento che attualmente non so dove l'utente metterà il programma". Sarebbe un errore da parte tua. Poiché questa è la tua ** domanda ** reale, ti preghiamo di ** aggiornare ** la domanda per includere una descrizione del tuo ** problema ** reale. Inoltre, guarda ancora la documentazione di Python. Tutte le informazioni che desideri sono effettivamente disponibili. La variabile globale '__file__' per esempio, fornirà molte informazioni. –

+0

Domanda aggiornata. Penso che la vera domanda stia emergendo come risultato del dialogo con te e FakeRainBrigand. Grazie per l'aggiornamento. Penso di avere tutte le opzioni di cui ho bisogno ora e leggerò di più sulle strade che hai suggerito. – Morlock

2

Se non si hanno dipendenze esterne, come i database o le impostazioni che devono essere configurati, uno script semplice setup.sh dovrebbe fare.

DIR=`pwd` 
NAME=my_app.py 
echo "#!/usr/bin/env sh 
python $DIR/my_app.py" > /usr/sbin/$NAME 
chmod a+x /usr/sbin/$NAME 

Può essere più complicato a seconda delle esigenze.

+0

Vedo la logica, ma in che modo mi consentirà di utilizzare i file necessari al mio file di programma (sotto program_folder/data)? Metterei l'eseguibile in/usr/local/bin, ma per quanto riguarda la cartella "data"? Grazie. – Morlock

+0

Forse c'è una directory riservata per i dati dove posso mettere i file di dati e aspettarmi che siano lì?/Usr/share/mio_programma? È una buona pratica farlo e quindi inserire il codice di sicurezza di questi file nel mio script, che sarebbe in/usr/local/bin? Sembra troppo semplice per essere vero :) La mia preoccupazione è di apprendere un modo corretto di farlo per i miei programmi futuri. – Morlock

+0

@Morlock, non c'è davvero nessun posto * corretto * per metterli. È perfettamente accettabile lasciarli dove l'utente li mette. La [risposta qui] potrebbe aiutarti a raggiungere la tua cartella di dati. – FakeRainBrigand

0

È possibile creare un file zip eseguibile che contenga script e file di dati che utilizza. Un'installazione ha solo bisogno di mettere questo file da qualche parte in $PATH e renderlo eseguibile: chmod +x my-program.

python: can executable zip files include data files?

Se si crea un adeguato setup.py che specifica come installare i file di dati e lo script poi ci sono molte più opzioni per installare il programma di esempio,

$ pip install --user http://example.com/your-program.tar.gz 

dove può essere installato pip tramite un System Packager, your-program.tar.gz, è possibile creare utilizzando python setup.py sdist.