对于sys.argv中的fi [1:]:参数列表太长了

时间:2015-03-10 13:37:25

标签: python bash arguments argv

我正在尝试对文件夹中的所有文本文件执行python脚本:

for fi in sys.argv[1:]:

我收到以下错误

-bash: /usr/bin/python: Argument list too long

我称之为Python函数的方式如下:

python functionName.py *.txt

该文件夹包含大约9000个文件。有没有办法运行此功能,而不必将我的数据拆分到更多的文件夹等?拆分文件不太实用,因为我将来必须在更多文件中执行该功能...谢谢

编辑:根据所选的正确回复和回复者(Charles Duffy)的评论,对我有用的是:

printf '%s\0' *.txt | xargs -0 python ./functionName.py

因为我没有有效的shebang ..

4 个答案:

答案 0 :(得分:5)

这是一个操作系统级别的问题(限制命令行长度),并且通常使用操作系统级别(或者至少是Python之外的过程)解决方案来解决:

find . -maxdepth 1 -type f -name '*.txt' -exec ./your-python-program '{}' +

...或...

printf '%s\0' *.txt | xargs -0 ./your-python-program

请注意,每发现一批文件运行your-python-program一次,批量大小取决于ARG_MAX中可以容纳的名称数量;如果这不合适,请参阅MarcusMüller的优秀答案。

答案 1 :(得分:2)

没有。这是命令行长度(以字节为单位)的内核限制。

通常,您可以通过执行

来确定该限制
getconf ARG_MAX

,至少对我来说,产生2097152(字节),这意味着大约2MB。

我建议您自己使用python来处理文件夹,即让您的python程序能够使用目录而不是单个文件,或者从文件中读取文件名。

前者可以使用os.walk(...)轻松完成,而第二种选择(在我看来)更灵活。使用argparse模块为您的python程序提供易于使用的命令行语法,然后添加文件类型的参数(请参阅参考文档),python将自动能够理解特殊文件名,如{{ 1}},意思是你可以代替

-

DO

for fi in sys.argv[1:]

甚至可以让你做类似

的事情
for fi in opts.file_to_read_filenames_from.read().split(chr(0))

答案 2 :(得分:1)

不要这样做。将掩码传递给python脚本(例如将其称为python functionName.py "*.txt")并使用glob(https://docs.python.org/2/library/glob.html)展开它。

答案 3 :(得分:1)

我考虑使用glob模块。使用此模块,您可以调用您的程序,如:

python functionName.py "*.txt"

然后shell不会将*.txt扩展为文件名。 Python程序将在参数列表中收到*.txt,您可以将其传递给glob.glob()

for fi in glob.glob(sys.argv[1]):
    ...