Python的'sys.argv'参数数量有限制吗?
我有一个Python脚本,需要处理很多文件。为了绕过Linux对命令参数数量的限制,我使用了 find -print0
和 xargs -0
。
我知道还有一个选择是使用Python的glob模块,但当我需要执行更复杂的 find
命令,比如查找修改时间等,这个模块就不够用了。
在处理大量文件时,Python只接受一部分参数。我最开始以为这是 argparse
的问题,但看起来是 sys.argv
的限制。我找不到相关的文档。这是个bug吗?
下面是一个示例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+
5 个回答
2
Python 似乎对参数的数量没有限制,但操作系统是有限制的。
想了解更多,可以看看 这里 的详细讨论。
2
你想从 find
得到的所有功能,其实都可以通过 os.walk
来实现。
所以,不要再用 find
和命令行来做这些事情了。
用 os.walk
,然后把你所有的规则和筛选条件都用 Python 写出来。
“查找修改时间”意味着你需要使用 os.stat
或者其他类似的库函数。
7
xargs
默认会把你的参数分成小块。你可以看看 --max-args
和 --max-chars
这两个选项,它们可以帮助你控制每次传递的参数数量和字符数。它的手册页也有说明这些限制(在 --max-chars
部分)。