Python 'sys.argv' ограничен в максимальном количестве аргументов? - PullRequest
3 голосов
/ 02 февраля 2012

У меня есть скрипт Python, который должен обрабатывать большое количество файлов.Чтобы обойти относительно небольшой лимит Linux на количество аргументов, которые могут быть переданы команде, я использую find -print0 с xargs -0.

Я знаю, что другим вариантом будет использование модуля глобуса Python, ноэто не поможет, если у меня есть более продвинутая команда find, которая ищет время модификации и т. д.

Когда мой скрипт запускает большое количество файлов, Python принимает только подмножество аргументов,я сначала подумал, что ограничение было в argparse, но, похоже, в sys.argv.Я не могу найти документацию по этому вопросу.Это ошибка?

Вот пример скрипта Python, иллюстрирующий эту мысль:

import argparse
import sys
import os

parser = argparse.ArgumentParser()
parser.add_argument('input_files', nargs='+')
args = parser.parse_args(sys.argv[1:])

print 'pid:', os.getpid(), 'argv files', len(sys.argv[1:]), 'argparse files:', len(args.input_files)

У меня много файлов для запуска:

$ find ~/ -name "*" -print0 | xargs -0 ls > filelist
748709 filelist

Ноон появляется xargs или Python разбивает мой большой список файлов и обрабатывает его несколькими различными запусками Python:

$ find ~/ -name "*" -print0 | xargs -0 python test.py
pid: 4216 argv files 1819 number of files: 1819
pid: 4217 argv files 1845 number of files: 1845
pid: 4218 argv files 1845 number of files: 1845
pid: 4219 argv files 1845 number of files: 1845
pid: 4220 argv files 1845 number of files: 1845
pid: 4221 argv files 1845 number of files: 1845
...

Почему создается несколько процессов для обработки списка?Почему это вообще кусается?Я не думаю, что в именах файлов есть новые строки, и не стоит ли -print0 и -0 решить эту проблему?Если бы были новые строки, я бы ожидал, что sed -n '1810,1830p' filelist покажет некоторую странность для приведенного выше примера.Что дает?

Я почти забыл:

$ python -V
Python 2.7.2+

Ответы [ 4 ]

7 голосов
/ 02 февраля 2012

xargs будет блокировать ваши аргументы по умолчанию.Посмотрите на опции --max-args и --max-chars xargs.Его справочная страница также объясняет ограничения (под --max-chars).

3 голосов
/ 02 февраля 2012

Все, что вы хотите от find, доступно от os.walk.

Не используйте find и оболочку для всего этого.

Используйте os.walk инапишите все свои правила и фильтры на Python.

«поиск времени модификации» означает, что вы будете использовать os.stat или некоторую похожую библиотечную функцию.

2 голосов
/ 02 февраля 2012

Python, похоже, не ограничивает количество аргументов, но операционная система делает это.

Посмотрите здесь для более всестороннего обсуждения.

1 голос
/ 02 февраля 2012

xargs пройдет столько, сколько сможет, но есть еще предел. Например,

find ~/ -name "*" -print0 | xargs -0 wc -l | grep total

даст вам несколько строк вывода.

Возможно, вы захотите, чтобы ваш сценарий либо взял файл, содержащий список имен файлов, либо принял имена файлов в своем стандартном файле.

...