Использование argparse в сочетании с sys.argv в Python - PullRequest
5 голосов
/ 08 декабря 2011

В настоящее время у меня есть скрипт, который использует глобализацию файлов с помощью переменной sys.argv, например:

if len(sys.argv) > 1:
        for filename in sys.argv[1:]:

Это прекрасно работает для обработки группы файлов;Однако я хотел бы использовать это с модулем argparse.Итак, я хотел бы, чтобы моя программа могла обрабатывать что-то вроде следующего:

foo@bar:~$ myScript.py --filter=xyz *.avi

Кто-нибудь пытался сделать это, или есть несколько указаний о том, как действовать?

Ответы [ 2 ]

16 голосов
/ 08 декабря 2011

Если я вас правильно понял, ваш вопрос касается передачи списка файлов вместе с несколькими флагами или необязательными параметрами в команду. Если я вас правильно понял, то вам просто нужно использовать параметры аргумента в argparse:

Файл p.py

import argparse

parser = argparse.ArgumentParser(description='SO test.')
parser.add_argument('--doh', action='store_true')
parser.add_argument('files', nargs='*')  # This is it!!
args = parser.parse_args()
print(args.doh)
print(args.files)

Комментируемая строка выше информирует парсер о том, что ожидается неопределенное число> = 0 (nargs ='*') позиционных аргументов.

Запуск сценария из командной строки дает следующие выходные данные:

$ ./p.py --doh *.py
True
['p2.py', 'p.py']
$ ./p.py *.py
False
['p2.py', 'p.py']
$ ./p.py p.py
False
['p.py']
$ ./p.py 
False
[]

Посмотрите, как файлы будут в списке, независимо от того, будут ли они несколько или только один.

НТН!

1 голос
/ 01 мая 2015

В качестве альтернативы вы можете использовать оба следующих способа:

import sys
import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--verbose", help="increase verbosity", action="store_true")
    args, unknown = parser.parse_known_args()
    for file in sys.argv:
        if not file.startswith("-"):
            print(file)

Однако это будет работать только для автономных параметров, в противном случае значения аргументов будут рассматриваться как аргументы файла (если вы не разделите их пробелом или не улучшите код дальше).

...