Python, optparse и маска файла - PullRequest
3 голосов
/ 23 ноября 2008
if __name__=='__main__':
    parser = OptionParser()
    parser.add_option("-i", "--input_file", 
                    dest="input_filename",
                      help="Read input from FILE", metavar="FILE")

    (options, args) = parser.parse_args()
    print options

результат

$ python convert.py -i video_*
{'input_filename': 'video_1.wmv'}

в текущей папке есть video_ [1-6] .wmv. Вопрос в том, почему video_ * стало video_1.wmv. Что я делаю не так?

Ответы [ 4 ]

8 голосов
/ 23 ноября 2008

Python не имеет к этому никакого отношения - это оболочка.

Вызов

$ python convert.py -i 'video_*'

и он будет указан в этом шаблоне.

Остальные шесть значений были переданы как аргументы, а не присоединены к -i, точно так же, как если бы вы запустили python convert.py -i video_1 video_2 video_3 video_4 video_5 video_6, а -i присоединяется только к ближайшему следующему параметру.

Тем не менее, вам лучше всего просто прочитать ваши входные имена из args вместо использования options.input.

2 голосов
/ 23 ноября 2008

Распечатайте аргументы, и вы увидите, куда идут другие файлы ...

Они преобразуются в отдельные аргументы в argv, и optparse принимает только первый аргумент в качестве значения параметра input_filename.

1 голос
/ 23 ноября 2008

уточнить:

aprogram -e *.wmv

в оболочке Linux, все символы подстановки (* .wmv) расширяются оболочкой. Так что aprogram фактически получает аргументы:

sys.argv == ['aprogram', '-e', '1.wmv', '2.wmv', '3.wmv']

Как и Чарльз сказал, вы можете процитировать аргумент, чтобы передать его буквально:

aprogram -e "*.wmv"

Это пройдет через:

sys.argv == ['aprogram', '-e', '*.wmv']
0 голосов
/ 23 ноября 2008

Это неочевидно, даже если вы читаете некоторые стандарты (например, , или , ).

Часть args командной строки - почти универсально - входные файлы.

Лишь в очень редких нечетных случаях входной файл указывается в качестве опции. Это случается, но это очень редко.

Кроме того, выходные файлы никогда не называются args . Они почти всегда предоставляются в виде именованных опций.

Идея в том, что

  1. Большинство программ могут (и должны) читать со стандартного ввода. Аргумент командной строки - является кодом для "stdin". Если аргументы не указаны, stdin является запасным планом.

  2. Если ваша программа открывает какие-либо файлы, она также может открывать неограниченное количество файлов, указанных в командной строке. Оболочка облегчает это, расширяя подстановочные знаки для вас. [Однако Windows не делает этого для вас.]

  3. Ваша программа никогда не должна перезаписывать файл без явных параметров командной строки, таких как '-o somefile', для записи в файл.

Обратите внимание, что cp, mv, rm являются большими примерами программ, которые не соответствуют этим стандартам.

...