Pytanie Jak korzystać z argparse Pythona z predefiniowanym ciągiem argumentów?


Chcę użyć modułu pythons argparse do przeanalizowania mojego parametru parametru cli. Działa to dla parametrów przejścia z terminala, ale nie dla danego ciągu.

import argparse

parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')

argString = 'someTestFile'
print(argString)

args = parser.parse_args(argString)

Jeśli uruchomię ten skrypt, otrzymam ten wynik:

~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e

The ~/someTestFile jest w jakiś sposób przekształcony o m e T e s t F i l e. Jak już wspomniano, działa, jeśli przekazuję nazwę pliku z terminala.

Mogę sobie wyobrazić, że ma to coś wspólnego z kodowaniem ciągów znaków. Czy ktoś ma pomysł, jak to naprawić?


13
2018-01-16 10:11


pochodzenie


możesz rzucić okiem na Dokumentacja argparse. - Rik Poggi


Odpowiedzi:


Ach, nie, nie, nie. parser.parse_args() oczekuje sekwencji w tej samej formie co sys.argv[1:]. Jeśli traktujesz łańcuch jak sekwencję sys.argv, dostajesz ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']. "s" staje się istotnym argumentem, a reszta łańcucha jest nie do zniesienia.

Zamiast tego prawdopodobnie chcesz przekazać parser.parse_args(['someTestFile'])


21
2018-01-16 10:15



Dzięki! To było to…! - thorink


Inną opcją jest użycie shlex.split. Jest to szczególnie wygodne, jeśli masz prawdziwy łańcuch argumentów CLI:

import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))

19
2017-09-03 15:47



Dzięki! Jest to bardzo przydatne. Teraz mogę uruchomić zarówno z wiersza poleceń, jak iz innych skryptów Pythona! - Sudhi
Ktoś proszę dać temu człowiekowi ciasteczko - John Johnson


Podobnie jak domyślnie sys.argv to lista, twoje argumenty również muszą być listą.

args = parser.parse_args([argString])

4
2018-01-16 10:17





Po prostu split twój ciąg poleceń:

args = parser.parse_args(argString.split())

Pełny przykład do zaprezentowania:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids')
    argString = "--dummy_opt 128 128"
    args = parser.parse_args(argString.split())

    print(args)

wyświetli:

Namespace(pic_resize=[128, 128])


0
2018-06-11 09:49