2012-01-31 13 views
5

Me gustaría usar argparse para analizar los argumentos que conoce y dejar el resto sin tocar. Por ejemplo, yo quiero ser capaz de ejecutarDejar los argumentos intactos con argparse

performance -o output other_script.py -a opt1 -b opt2 

que utiliza la opción de -o y deja el resto intacto.

El módulo de profiler.py hace una cosa similar con optparse, pero ya que estoy usando argparse estoy haciendo:

def parse_arguments(): 
    parser = new_argument_parser('show the performance of the given run script') 
    parser.add_argument('-o', '--output', default='profiled.prof') 

    return parser.parse_known_args() 

def main(): 
    progname = sys.argv[1] 
    ns, other_args = parse_arguments() 
    sys.argv[:] = other_args 

Lo que también parece funcionar, pero ¿qué ocurre si también other_script.py también tiene una bandera -o?

¿Existe en general una mejor manera de resolver este problema?

Respuesta

5

argparse se detendrá para analizar el argumento hasta EOF o --. Si usted quiere tener argumento sin beeing analizada por argparse, puede escribir ::

python [PYTHONOPTS] yourfile.py [YOURFILEOPT] -- [ANYTHINGELSE] 
+0

Ah no sabía nada de que gracias! Sin un marcador, de hecho, sería muy difícil para argparse entender lo que está pasando, supongo, no es un problema fácil. –

+0

Debe aclararse que debe usar el método 'parse_known_args()' (al menos en python3. 6) – krishonadish

12

También puede añadir un argumento posicional a su analizador con nargs=argparse.REMAINDER, para capturar la secuencia de comandos y sus opciones:

# In script 'performance'... 
p = argparse.ArgumentParser() 
p.add_argument("-o") 
p.add_argument("command", nargs=argparse.REMAINDER) 
args = p.parse_args() 
print args 

la ejecución del script mínima por encima de ...

$ performance -o output other_script.py -a opt1 -b opt2 
Namespace(command=['performance', '-a', 'opt1', '-b', 'opt2'], o='output') 
+1

también 'parse_known_args' debería hacer esto. –

+0

Esto parece dejar incluso '--' intacto. ¡Perfecto! – user1338062

Cuestiones relacionadas