繁体   English   中英

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

[英]for fi in sys.argv[1:]: argument list too long

我试图在文件夹中的所有文本文件上执行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 ..

这是一个操作系统级别的问题(命令行长度限制),并且通常使用操作系统级别(或至少在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的优秀答案。

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

通常,您可以通过执行来确定该限制

getconf ARG_MAX

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

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

前者可以使用os.walk(...)轻松完成,而第二种选择(在我看来)更灵活。 使用argparse模块为你的python程序提供一个易于使用的命令行语法,然后添加一个文件类型的参数(参见参考文档),python将自动能够理解像-这样的特殊文件名,这意味着你可以改为的

for fi in sys.argv[1:]

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

甚至可以让你做类似的事情

find -iname '*.txt' -type f -print0|my_python_program.py -file-to-read-filenames-from - 

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

我想使用glob模块。 使用此模块,您可以调用以下程序:

python functionName.py "*.txt"

那么shell不会将*.txt扩展为文件名。 Python程序将在argumens列表中接收*.txt ,您可以将其传递给glob.glob()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM