2015-06-08 1 views
0

Я работаю над некоторым кодом Python, который использует optparse, чтобы получить имя некоторых входных файлов, затем (на бумаге) расширяет этот ввод, используя, по возможности, glob.glob().Захват файловой системы globs с использованием optparse

Кажется, что моя оболочка (zsh) расширяет glob перед тем, как передать ее на Python. Например, если я запустил python myscript.py *.txt, я получу первый соответствующий файл .txt вместо буквенного глоба, *.txt. Для меня это бесполезно.

Я полагаю, что это больше проблема на стороне корпуса; но с учетом переносимости, я хотел бы знать, есть ли на стороне Python решение.

optparse код, используемый для этого:

p = OptionParser() 
p.add_option('-f', '--infile', dest='input', action='store', type='string') 
(options, args) = p.parse_args() 

Вопрос воспроизводит со следующим минимальным примером (который также показывает, что она распространяется на извлечение ручного аргумента с использованием sys.argv):

$ ls *.txt 
file1.txt file2.txt file3.txt 
$ python -c 'import sys; print sys.argv' *.txt 
['-c', 'file1.txt', 'file2.txt', 'file3.txt'] 

Итак, еще раз , для ясности, я ищу способ передать glob literal моему коду python, чтобы он расширился там, используя Python, потому что обходной путь оболочки повреждает переносимость.

ответ

1

Если это единственный аргумент, который вы передаете, то остальную часть расширения Глобы в настоящее время втянутый позиционной частью args синтаксического кортежа, поэтому, возможно, попытайтесь использовать это?

from optparse import OptionParser 

p = OptionParser() 
p.add_option('-f', '--filename', dest='input', action='store', type='string') 
options, args = p.parse_args() 

print options 
print args 

дает вам:

$ ls *.txt 
failure_counts.txt iscsi-targets.txt README.txt snmp.txt success_counts.txt 
$ python glob.py -f *.txt 
{'input': 'failure_counts.txt'} 
['iscsi-targets.txt', 'README.txt', 'snmp.txt', 'success_counts.txt'] 
0

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

$ ls *.txt 
file1.txt file2.txt file3.txt 
$ python -c 'import sys; print sys.argv' *.txt 
['-c', 'file1.txt', 'file2.txt', 'file3.txt'] 
$ python -c 'import sys; print sys.argv' \*.txt 
['-c', '*.txt'] 
+0

Я знал об этом; но есть ли решение, которое не требует, чтобы конечный пользователь избежал специальных символов? – Jules

+0

Или вы можете 'set -f', но непонятно, почему это было бы лучше, чем поведение по умолчанию оболочки. Может быть, ОП должен объяснить, почему проблема по умолчанию кажется проблематичной? – tripleee

+0

@ tripleee проблема по умолчанию, потому что, если я буду строить вокруг * shell * расширяющихся глобусов, прежде чем я их получу, мне придется переписать большой кусок моего парсера вручную. На данный момент это просто пустая трата времени, и это может оказаться полезным и в будущем. – Jules