Python'sys.argv'是否限制了最大参数数量?

Jak*_*ger 3 python xargs argv argparse

我有一个需要处理大量文件的Python脚本.为了解决上可以传递给命令的参数个数Linux的规模相对较小的限制,我使用find -print0xargs -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)
Run Code Online (Sandbox Code Playgroud)

我有很多文件可以运行:

$ find ~/ -name "*" -print0 | xargs -0 ls > filelist
748709 filelist
Run Code Online (Sandbox Code Playgroud)

但看起来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
...
Run Code Online (Sandbox Code Playgroud)

为什么要创建多个进程来处理列表?为什么它会被分块呢?我不认为有换行符的文件名,不应该-print0-0把该问题的关心?如果有换行符,我希望sed -n '1810,1830p' filelist上面的例子显示出一些奇怪之处.是什么赋予了?

我差点忘了:

$ python -V
Python 2.7.2+
Run Code Online (Sandbox Code Playgroud)

Lar*_*off 7

xargs默认会将你的参数组织起来.看看--max-args和的--max-chars选项xargs.它的手册页也解释了限制(下--max-chars).