2012-07-03 32 views
12

me gustaría tener la siguiente sintaxis:Python: argparse argumentos opcionales sin guiones

python utility.py file1 FILE1 file2 FILE2 

donde archivo1 y archivo2 son argumentos opcionales. Es sencillo de hacer que funcione con esta sintaxis:

python utility.py --file1 FILE1 --file2 FILE2 

usando

parser.add_argument('--file1',type=file) 
parser.add_argument('--file2',type=file) 

Sin embargo, si quito los guiones, se inicia argparse a interpretar como una posición en lugar de argumento opcional ...

En otras palabras, ¿es posible decirle específicamente a argparse si un argumento es opcional o posicional para que pueda tener parámetros opcionales sin los guiones?

+2

que la sintaxis (sin guiones) es confuso como el infierno! Hay una razón por la que existe la convención. –

+1

@MartijnPieters: puede ser confuso pero para algunas aplicaciones científicas esto es un estándar ... [ejemplo] (http://www.ccp4.ac.uk/html/refmac5/description.html) – jvm

+1

@MartijnPieters: contraejemplo: la interfaz de línea de comando 'git' o' svn'. –

Respuesta

4

No hay forma de obtener argparse para que haga esto por usted. Sin embargo, se puede hacer argparse aceptar cualquier número de argumentos posicionales:

parser.add_argument('FILES',nargs='*') 
options=parser.parse_args() 
file1,optional_files=options.FILES[0],options.FILES[1:] 

Por supuesto, es posible que desee añadir algunas comprobaciones para asegurarse de que al menos 1 archivo se le dio, etc.

EDITAR

todavía no estoy 100% seguro de lo que usted quiere aquí, pero si file1 y file2 están las cadenas literales, se puede evitar que un poco de pre-procesamiento sys.argv. Por supuesto, esto todavía va a dar formato al mensaje de ayuda extraña, pero siempre se puede añadir un epílogo que explica que una u otra forma está bien:

import argparse 
import sys 

mangle_args=('file1','file2') 
arguments=['--'+arg if arg in mangle_args else arg for arg in sys.argv[1:]] 

parser=argparse.ArgumentParser() 
parser.add_argument('--file1') 
parser.add_argument('--file2') 
options=parser.parse_args(arguments) 
+0

Los argumentos posicionales no son suficientes para mí. Por ejemplo, el archivo1 puede omitirse, el archivo2 ingresado, el archivo3 omitido, el archivo4 ingresado y la asignación es importante (es decir, necesito saber que el archivo especificó el archivo2 y el archivo4) – jvm

+1

@jvm - ¿Cómo es argparse (o cualquier cosa) supone saber que el archivo que le dio es 'archivo2' en lugar de' archivo1'? Si no puede resolverlo desde el orden en que entró en la línea de comandos, ciertamente 'argparse' tampoco puede hacerlo. – mgilson

+0

Son las cadenas constantes 'file1' y' file2', o son nombres de archivos, quizás eso es lo que no entiendo aquí ... – mgilson

Cuestiones relacionadas