2011-10-07 16 views
10

Tengo mi archivo python llamado convertImage.py y dentro del archivo tengo un script que convierte una imagen a mi gusto, todo el script de conversión se establece dentro de una función llamada convertFile (fileName)ejecutar python script con la función de línea de comandos, Linux

Ahora mi problema es que necesito ejecutar este script de python desde la línea de comandos de Linux mientras paso la función convertFile (fileName) junto con él.

ejemplo:

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

Esto debe ejecutar el script en Python que pasa a la función apropiada.

ejemplo:

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 

¿Cuál es la manera correcta de ejecutar este script en Python y debidamente pasar el nombre de archivo a la función desde la línea de comandos liunx?

Gracias de avanzada

+2

no hay tal cosa. Analice la lista 'sys.argv' y elija la acción correcta. Compruebe 'argparse' el módulo – JBernardo

+0

Como lo menciona S.Lott,' 'es un estilo muy común. Lo mejor para el usuario es tener nombres de comando, no conocimiento de la implementación interna. Y usar paréntesis (que requieren escaparse en bash) como parte requerida de su sintaxis es simplemente malo. – Cascabel

+0

Los paréntesis fueron sólo por razones de ejemplo, pero agradecí toda la ayuda y lo puse a trabajar usando sys.argv – knittledan

Respuesta

21

Este

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

esto va a funcionar. Pero es increíblemente peligroso.

Realmente necesita pensar cuál es la sintaxis de su línea de comandos. Y necesita pensar por qué está rompiendo los estándares de Linux establecidos desde hace tiempo para especificar argumentos para un programa.

Por ejemplo, debería considerar eliminar las inútiles () en su ejemplo. Hazlo esto, en cambio.

python convertImage.py convertFile fileName 

A continuación, puede - con poco trabajo - usar argparse para obtener el comando ("convertFile") y los argumentos ("nombre de archivo") y el trabajo dentro de la sintaxis de línea de comandos estándar de Linux.

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

Buena combinación de responder brevemente a X al dirigirse principalmente a Y – Thomas

+0

@ S.Lott ¿Cuál es el propósito de la función_map dict aquí? ¿Por qué tiene dos teclas para el comando? – Helk

4

Manera rápida y sucia:

linux user$: python convertImage.py convertFile fileName 

y luego en convertImage.py

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

Un enfoque más sofisticadas se utiliza argparse (por 2.7 o 3.2 y versiones posteriores) o optparse.

+0

argparse también está en 2.7 –

+0

@PetrViktorin: Gracias, actualizado. –

0

Crear una parte ejecutable de nivel superior de la secuencia de comandos que analiza los argumentos de línea de comandos (s) y luego pasarlo a su función en una llamada, así:

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) 

Entonces, desde un shell,

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

-1 por no sugerir usar argparse – Kimvais

+0

¿esto requiere un hashbang? –

Cuestiones relacionadas