У меня есть скрипт Python, которому нужно обработать большое количество файлов. Чтобы обойти относительно небольшое ограничение Linux на количество аргументов, которые могут быть переданы команде, я использую find -print0
с xargs -0
.
Я знаю, что другим вариантом было бы использование модуля Python glob, но это не поможет, когда у меня есть более продвинутая команда 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+
filelist
внутри вашего скрипта. - person Benjamin Bannier   schedule 02.02.2012~/
и-name *
напрямую? - person John La Rooy   schedule 02.02.2012