Parámetros de la línea de comandos de Python

Estoy empezando con python, así que estoy luchando con un ejemplo bastante simple. Básicamente, quiero pasar el nombre de un ejecutable más su entrada a través de los argumentos de la línea de comando, por ejemplo:

python myprogram refprogram.exe refinput.txt 

Eso significa que al ejecutar myprogram , ejecuta refprogram.exe y lo pasa como argumento refinput . Intenté hacerlo de la siguiente manera:

 import sys, string, os print sys.argv res = os.system(sys.argv(1)) sys.argv(2) print res 

El mensaje de error que recibo es:

 res = os.system(sys.argv(1)) sys.argv(2) ^ SyntaxError: invalid syntax 

¿Alguien tiene una idea de lo que estoy haciendo mal?

Estoy corriendo Python 2.7

Esta línea

 res = os.system(sys.argv(1)) sys.argv(2) 

Está mal en un par de maneras.

Primero, sys.argv es una lista, así que usa corchetes para acceder a su contenido:

 sys.argv[1] sys.argv[2] 

En segundo lugar, cierra sus paréntesis en os.system demasiado pronto y sys.argv(2) se queda colgando del final. Desea mover el paréntesis de cierre hacia el final de la línea, después de todos los argumentos.

Tercero, necesitas separar los argumentos con comas, un espacio simple no sirve.

Tu línea final debería verse así:

 res = os.system(sys.argv[1], sys.argv[2]) 

Una manera mucho mejor de hacer esto es con la biblioteca argparse . La biblioteca de envolturas enviadas también hace que sea más fácil trabajar con subprocesos .

Un ejemplo simple:

 import argparse import envoy def main(**kwargs): for key, value in kwargs.iteritems(): print key, value cmd = '{0} {1}'.format(kwargs['program'], ' '.join(kwargs['infiles'])) r = envoy.run(cmd) print r.std_out print r.std_err if __name__ == '__main__': parser = argparse.ArgumentParser(description='Get a program and run it with input', version='%(prog)s 1.0') parser.add_argument('program', type=str, help='Program name') parser.add_argument('infiles', nargs='+', type=str, help='Input text files') parser.add_argument('--out', type=str, default='temp.txt', help='name of output file') args = parser.parse_args() main(**vars(args)) 

Esto lee los argumentos, los analiza y luego los envía al método principal como un diccionario de palabras clave y valores. Eso le permite probar su método principal independientemente de su código de argumento, pasando un diccionario preconstruido.

El método principal imprime las palabras clave y los valores. Luego crea una cadena de comandos y se la pasa al enviado para que la ejecute. Finalmente, imprime la salida del comando.

Si tiene instalado pip, envoy puede instalarse con pip install envoy . La forma más fácil de obtener pip es con el instalador de pip .

sys.argv es una lista y se indexa mediante corchetes, por ejemplo, sys.argv[1] . Es posible que desee comprobar len(sys.argv) antes de len(sys.argv) también.

Además, si desea pasar parámetros a os.system() , es posible que desee algo como os.system(' '.join(sys.argv[1:])) , pero esto no funcionará para argumentos con espacios. Es mejor utilizar el módulo de subproceso.

sys.argv es una lista

 import sys, string, os print sys.argv res = os.system(sys.argv[1]) sys.argv[2] print res 

Si está ejecutando Python 2.7, se recomienda utilizar el nuevo módulo de subprocess .

En este caso escribirías

 import sys, subprocess result = subprocess.check_output(sys.argv[1], sys.argv[2])