[英]What is Python first argument? sys.argv[0] or sys.argv[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.