Python: обрабатывать подстановку в скрипте

$ script.py *.txt

Я хочу запустить script.py для всех файлов .txt в этом каталоге, включая 1.txt, 2.txt и 3.txt. Я могу придумать два подхода к этому: использование скрипта python для обработки подстановки или создание нескольких процессов в оболочке.

Я предпочитаю, чтобы сценарий обрабатывал подстановку.

В соответствии с Предотвратить подстановку после подстановки переменных я могу использовать set -f, чтобы отключить ее. Как я могу указать эту опцию исключительно для сценариев Python?


person Brian    schedule 21.08.2013    source источник
comment
Как насчет третьего подхода: пусть оболочка порождает один процесс с несколькими аргументами. Это обычный способ работы по умолчанию, и с ним очень легко справиться в вашем скрипте Python (либо зациклив sys.argv[1:], либо используя fileinput).   -  person abarnert    schedule 22.08.2013
comment
Это хорошая идея, но я бы хотел, чтобы она работала для разных сценариев, которые принимают переменное количество параметров, в том числе когда я использую optparse или argparse.   -  person Brian    schedule 22.08.2013
comment
Я вообще не вижу в этом проблемы. Почти каждый инструмент, поставляемый с любой системой Unix, и 90% сторонних программ и скриптов, которые вы там найдете, используют optparse или argparse или другие библиотеки, принимают переменное количество параметров и отлично работают с шаровидная оболочка. Если у вас этого не происходит, вы, вероятно, неправильно спроектировали интерфейс, и это то, что вам нужно исправить.   -  person abarnert    schedule 22.08.2013
comment
хм, я думаю, ты прав. Я предполагаю, что вы имеете в виду обернуть его в сценарий оболочки, который расширит параметры с помощью $@? Если вы напишите это в ответе, я приму это   -  person Brian    schedule 22.08.2013
comment
Я думал о том, чтобы предложить это, но на самом деле, вам даже это не нужно. Если ваш script.py может работать с несколькими входными файлами (т. е. с несколькими аргументами, оставшимися после синтаксического анализа параметров), так же, как, например, ls, то подстановка оболочки не вызовет никаких проблем. Есть некоторые инструменты, для которых такой интерфейс был бы нецелесообразным (например, convert в ImageMagick имеет опции, вставленные между аргументами; find, очевидно, должен делать свои собственные блоббинги…), но они являются редким исключением, а не правилом. Как вы думаете, почему ваш сценарий является исключением?   -  person abarnert    schedule 22.08.2013
comment
Хорошо, похоже, что оболочка просто пихает все совпадающие файлы, разделенные пробелами, в пространство, занимаемое *.txt. Я не знал об этом, так как дополнительные аргументы пропали после входа в сценарий, который явно не обрабатывал их. Учитывая этот факт, ваш первоначальный комментарий имеет смысл. Спасибо, что помогли мне определить проблему. Мой первоначальный вопрос, хотя и несуществующий, по-прежнему остается интересным вопросом, и мне любопытно посмотреть, как кто-то решит эту проблему, как предполагалось изначально.   -  person Brian    schedule 22.08.2013
comment
Ну, оболочка работает с аргументами, а не со строкой, разделенной пробелами. (В противном случае он не работал бы с файлами, содержащими пробелы, или если бы где-то были кавычки и т. д.) Таким образом, он заменяет один аргумент *.txt несколькими аргументами (аналогично тому, что сделал бы Python a[5:6] = glob(a[5])), а затем передает полученный аргумент список для вашей программы.   -  person abarnert    schedule 22.08.2013


Ответы (3)


Если по какой-то причине вам нужно пожрать внутри скрипта (например, подсчитать общее количество обработанных файлов), то можно использовать:

script.py '*.txt'

or

script.py "*.txt"
person Mario Rossi    schedule 21.08.2013
comment
Это хорошо работает. Для команд, запускаемых без кавычек, есть ли способ автоматически исправить кавычки вокруг каждого аргумента? - person Brian; 22.08.2013
comment
@ Брайан Брайан Не по команде, насколько я знаю. Либо глобально по set -f, либо по кавычкам. - person Mario Rossi; 22.08.2013

Почему вы хотите сделать это с помощью подстановки Python? Сценарий оболочки был бы идеальным, ИМХО, и вы отделяете основные функции того, что должен делать ваш скрипт python, от черной задачи по его запуску для всех *.txt файлов в каталоге.

person Sudipta Chatterjee    schedule 21.08.2013
comment
Как указал @mario, бывают случаи, когда сценарию может потребоваться обработка метаданных из других файлов. Хотя и не против. Я также не уверен, как использовать псевдоним python в сценарии оболочки. - person Brian; 22.08.2013
comment
Вы спрашиваете, как вызвать скрипт Python из сценария оболочки? Строка, которая говорит python myScript.py из сценария оболочки, была бы просто отличной, предполагая, что python уже где-то доступна в вашем $PATH - person Sudipta Chatterjee; 22.08.2013

Если у вас огромное количество файлов в каталоге, iglob() будет лучше. Вы должны передать параметр glob в виде строки:

$ script.py "*.txt"
person Brent Washburne    schedule 21.08.2013