Python 'sys.argv' é limitado no número máximo de argumentos?
Eu tenho um script Python que precisa processar um grande número de arquivos. Para contornar o limite relativamente pequeno do Linux no número de argumentos que podem ser passados para um comando, estou usandofind -print0
comxargs -0
.
Eu sei que outra opção seria usar o módulo glob do Python, mas isso não ajudará quando eu tiver umfind
comando, procurando horários de modificação et
Ao executar meu script em um grande número de arquivos, o Python aceita apenas um subconjunto dos argumentos, uma limitação que eu pensava inicialmente estar emargparse
, mas parece estar emsys.argv
. Não consigo encontrar nenhuma documentação sobre isso. É um bug?
Aqui está um exemplo de script Python que ilustra o ponto:
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)
Tenho muitos arquivos para executar isso em:
$ find ~/ -name "*" -print0 | xargs -0 ls > filelist
748709 filelist
Mas parece xargs ou o Python está dividindo minha grande lista de arquivos e processando-a com várias execuções diferentes do 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
...
Por que vários processos estão sendo criados para processar a lista? Por que está sendo fragmentado? Acho que não há novas linhas nos nomes dos arquivos e não deveria-print0
e-0
cuida dessa questão? Se houvesse novas linhas, eu esperariased -n '1810,1830p' filelist
para mostrar alguma estranheza no exemplo acima. O que da
Eu quase esqueci
$ python -V
Python 2.7.2+