2011-10-07 11 views
10

Ho il mio file python chiamato convertImage.py e all'interno del file ho uno script che converte un'immagine a mio piacimento, l'intero script di conversione è impostato all'interno di una funzione chiamata convertFile (fileName)esegui script python con la funzione dalla riga di comando, Linux

Ora il mio problema è che ho bisogno di eseguire questo script python dalla riga di comando di linux mentre passo la funzione convertFile (fileName) insieme ad essa.

esempio:

linux user$: python convertImage.py convertFile(fileName) 

Questo dovrebbe eseguire lo script python passando la funzione appropriata.

esempio:

def convertFile(fileName): 

    import os, sys 
    import Image 
    import string 

    splitName = string.split(fileName, "_") 
    endName = splitName[2] 
    splitTwo = string.split(endName, ".") 
    userFolder = splitTwo[0] 

    imageFile = "/var/www/uploads/tmp/"+fileName 

    ...rest of the script... 

    return 

Qual è il modo giusto per eseguire questo script python e correttamente passare il nome del file per la funzione dalla riga di comando liunx?

Grazie in anticipo

+2

non esiste una cosa del genere. Analizza l'elenco 'sys.argv' e scegli l'azione giusta. Controllare 'argparse' il modulo – JBernardo

+0

Come menzionato da S.Lott,' 'è uno stile molto comune. È meglio che l'utente abbia i nomi dei comandi, non la conoscenza dell'implementazione interna. E usare le parentesi (che richiedono l'escaping in bash) come parte della sintassi richiesta è solo meschino. – Cascabel

+0

Le parentesi erano solo per ragioni di esempio ma ho apprezzato tutto l'aiuto e ho funzionato usando sys.argv – knittledan

risposta

21

Questo

if __name__ == "__main__": 
    command= " ".join(sys.argv[1:]) 
    eval(command) 

questo funzionerà. Ma è follemente pericoloso.

È davvero necessario pensare a quale sia la sintassi della riga di comando. E devi pensare al motivo per cui stai infrangendo gli standard Linux consolidati per specificare gli argomenti di un programma.

Ad esempio, si consiglia di rimuovere l'inutile () nell'esempio. Fai questo, invece.

python convertImage.py convertFile fileName 

Quindi, è possibile - con poco lavoro - utilizzare argparse per ottenere il comando ("convertFile") e gli argomenti ("nomefile") e il lavoro all'interno della sintassi riga di comando di Linux standard.

function_map = { 
    'convertFile': convertFile, 
    'conv': convertFile, 
} 
parser = argparse.ArgumentParser() 
parser.add_argument('command', nargs=1) 
parser.add_argument('fileName', nargs='+') 
args= parser.parse_args() 
function = function_map[args.command] 
function(args.fileName) 
+2

Buona combinazione di risposta X brevemente indirizzata principalmente a Y – Thomas

+0

@ S.Lott Qual è lo scopo della dicitura function_map qui? Perché ha due chiavi per il comando? – Helk

4

e veloce modo sporco:

linux user$: python convertImage.py convertFile fileName 

e poi in convertImage.py

if __name__ == '__main__': 
    import sys 
    function = getattr(sys.modules[__name__], sys.argv[1]) 
    filename = sys.argv[2] 
    function(filename) 

Un approccio più sofisticato potrebbe usare argparse (per 2.7 o 3.2 +) oppure optparse.

+0

argparse è anche in 2.7 –

+0

@PetrViktorin: Grazie, aggiornato. –

0

Creare una parte eseguibile di livello superiore dello script che analizza argomento della riga di comando (s) e poi passarlo alla funzione in una chiamata, in questo modo:

import os, sys 
#import Image 
import string 


def convertFile(fileName): 
    splitName = string.split(fileName, "_") 
    endName = splitName[2] 
    splitTwo = string.split(endName, ".") 
    userFolder = splitTwo[0] 

    imageFile = "/var/www/uploads/tmp/"+fileName 

    print imageFile  # (rest of the script) 

    return 


if __name__ == '__main__': 
    filename = sys.argv[1] 
    convertFile(filename) 

Poi, da una conchiglia,

$ convertImage.py the_image_file.png 
/var/www/uploads/tmp/the_image_file.png 
+0

-1 per non suggerire l'uso di argparse – Kimvais

+0

richiede un hashbang? –

Problemi correlati