Hay una manera de llamar a mi programa en python y pasar una cadena que desea analizar sin declarar la cadena como 'String I want to parse' pero como String I want to parse

import argparse

#Parse command line for input
parser = argparse.ArgumentParser(description='Parse input string')
#position input argument
parser.add_argument('string', help='Input String')

args = parser.parse_args()
arg_str = args.string

print(arg_str)

cuando ejecuto $ python test.py String I want to parse me sale el error: test.py: error: unrecognized arguments: I want to parse

Es de todos modos hay que decir la secuencia de comandos para dar cuenta de los espacios y tomar la entrada como una cadena hasta el final de la entrada se alcanza o de otra, analizar el argumento como -s se alcanza?

  • Es posible utilizar sys.argv que recupera todos los argumentos de la línea de comandos en una lista, y luego construir su cadena dentro de su programa de análisis de esta lista.
InformationsquelleAutor wprins | 2015-12-13

4 Comentarios

  1. 3

    Si usted realmente desea utilizar argparse agregar nargs='+' o nargs='*' a add_argument:

    import argparse
    parser = argparse.ArgumentParser(description='Parse input string')
    parser.add_argument('string', help='Input String', nargs='+')
    args = parser.parse_args()
    arg_str = ' '.join(args.string)
    print(arg_str)

    python test.py abc xyz producirá abc xyz. * significa que la lista vacía es aceptar y + requiere al menos una palabra.

    Alternativamente, usted puede apenas usuario sys.arg si usted no necesita nada de fantasía:

    import sys
    arg_str = ' '.join(sys.argv[1:])  # skip name of file
    print(arg_str)

    Y si puedo, me gusta docopt por lo que recomiendo es:

    """Usage:
      test.py <input>...
    """
    
    import docopt
    arguments = docopt.docopt(__doc__)
    input_argument = ' '.join(arguments['<input>'])
    print(input_argument)

    Docopt genera un analizador basado en el mensaje de ayuda, es tan grande.

    • Gracias a esto es genial. Puede que me explique qué: arg_str = ' '.join(args.string) está haciendo?
    • Cuando se utiliza nargs, a continuación, args.cadena es una lista de cadenas de caracteres, no de una sola cadena (por lo que el nombre de la variable es lamentable). ».join([‘a’, ‘b’, ‘c’] resultados en la ‘a b c’.
    • Este enfoque puede obtener peludo de una vez «el final de la entrada se alcanza o de otra, analizar el argumento -s se alcanza» , como se menciona en la pregunta. Si hay otras opciones para analizar, habrá algo interesante necesidad de codificación
    • por qué? en mi (no tan extensa) experiencia de obras y documentación de nargs no menciona ningún tipo de restricciones, incluso da ejemplo como este >>> parser.add_argument('--bar', nargs='*') >>> parser.add_argument('baz', nargs='*')
    • Lo siento, yo estaba hablando acerca de la opción para utilizar ' '.join(sys.argv[1:]). Lo ideal creo que esta unión debe ser realizada por el ArgumentParser ejemplo, en lugar de por el manual de post-procesamiento de la args
    • Escribí sobre él como la alternativa más sencilla para el uso de argparse, un poco ignorando el comentario de OP. Es probablemente innecesaria. Estoy de acuerdo con la segunda parte, que es la razón por la que me upvoted tu respuesta :).

  2. 4

    El «correcto» es el ya se ha mencionado. Pero, OP preguntó específicamente:

    Quiero analizar sin declarar la cadena como 'String I want to parse' pero como String I want to parse

    Es posible hacer esto con un acción personalizada. La ventaja de este enfoque con respecto a simplemente unirse a sys.argv[1:] es para tratar el siguiente:

    Es de todos modos hay que decir la secuencia de comandos para dar cuenta de los espacios y tomar la entrada como una cadena hasta el final de la entrada se alcanza o de otra, analizar el argumento -s se alcanza?

    Podemos agregar otras opciones sin ser absorbido en la ‘cadena’ argumento:

    import argparse
    
    class MyAction(argparse.Action):
        def __call__(self, parser, namespace, values, option_string=None):
            setattr(namespace, self.dest, ' '.join(values))
    
    parser = argparse.ArgumentParser(description='Parse input string')
    parser.add_argument('string', help='Input String', nargs='+', action=MyAction)
    parser.add_argument('--extra', '-s', help='Another Option!')
    
    args = parser.parse_args()
    print args

    Demo:

    $ python example.py abc def ghi
    Namespace(extra=None, string='abc def ghi')
    $ python example.py abc def ghi -s hello
    Namespace(extra='hello', string='abc def ghi')
    $ python example.py -s hello abc def ghi 
    Namespace(extra='hello', string='abc def ghi')
    • sería genial si MyAction tenía nombre más significativo
    • Sí. Deja como ejercicio para el lector… 😉
  3. 2

    El problema es que dar cinco argumentos en lugar de uno. Pon tu cadena con el espacio entre las comillas dobles y va a trabajar.

    ~ ❯❯❯ python test.py asd asd
    usage: test.py [-h] string
    test.py: error: unrecognized arguments: asd
    ~ ❯❯❯ python test.py "asd asd"
    asd asd
    ~ ❯❯❯
    • Gracias por el aporte @pero Sólo quiero mi entrada para escribirse sin comillas
  4. 0

    Sólo podría concatenar todos los argumentos juntos hasta que un argumento se inicia con -

    import sys
    
    new_args = []
    for arg in sys.argv:
       if arg.startswith("-") or len(new_args) == 0:
          new_args.append(arg)
       else:
          new_args[-1] += arg

Dejar respuesta

Please enter your comment!
Please enter your name here