我在Linux 3.16.0上运行Python 3.4.3。 我想使用subprocess.Popen来运行一个长单参数(一个复杂的Bash调用),大约200KiB的命令。
根据getconf和xargs ,这应该是在我的范围内:
$ getconf ARG_MAX 2097152 $ xargs --show-limits < /dev/null Your environment variables take up 3364 bytes POSIX upper limit on argument length (this system): 2091740 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we Could actually use: 2088376 Size of command buffer we are actually using: 131072
但是,Python失败的时候会有相当小的限制:
>>> subprocess.Popen('echo %s > /dev/null' % ('a' * (131072-4096)),shell=True,executable='/bin/bash') <subprocess.Popen object at 0x7f4613b58410> >>> subprocess.Popen('echo %s > /dev/null' % ('a' * (262144-4096)),executable='/bin/bash') Traceback (most recent call last): [...] OSError: [Errno 7] Argument list too long
请注意,Python限制与“实际使用”命令缓冲区xargs报告大致相同。 这表明xargs在某种程度上足够聪明,可以从更小的限制开始,根据需要增加它,但是Python不是。
Windows是否返回命令行切换字符?
在bash中输出*的长度限制是多less?
“参数列表太长”限制是否适用于shell buildins?
在cli中指定python模块
c:程序执行问题
问题:
为什么Python限制小于2MiB的操作系统限制?
我可以增加Python限制吗?
如果是这样,怎么样?
无法逃脱Windows的命令shell空间
清除给定的命令行string以匹配文件path
在最后一个参数中的正斜杠导致批文件(“%〜dp0”)目录的path改变
Magnify.exe命令行参数
在Linux和Windows中工作的命令行参数
单个字符串参数的最大大小限制为131072.它与python无关:
~$ /bin/echo "$(printf "%*s" 131071 "a")">/dev/null ~$ /bin/echo "$(printf "%*s" 131072 "a")">/dev/null bash: /bin/echo: Argument list too long
实际上是MAX_ARG_STRLEN决定单个字符串的最大大小:
作为2.6.23以后的附加限制,一个参数不能超过MAX_ARG_STRLEN(131072)。 这可能会变得相关,如果你产生一个长的调用像“sh -c”用长参数生成“”。 (由Xan Lopez和Ralf Wildenhues指出)
请参阅关于ARG_MAX讨论 ,在“参数个数和一个参数的最大长度”下,以及关于unix.stackexchange 这个问题 。
你可以在binfmts.h看到它:
/* * These are the maximum length and maximum number of strings passed to the * execve() system call. MAX_ARG_STRLEN is essentially random but serves to * prevent the kernel from being unduly impacted by misaddressed pointers. * MAX_ARG_STRINGS is chosen to fit in a signed 32-bit integer. */ #define MAX_ARG_STRLEN (PAGE_SIZE * 32) #define MAX_ARG_STRINGS 0x7FFFFFFF ~$ echo $(( $(getconf PAGE_SIZE)*32 )) 131072
您可以传递多个长度为131071字符串:
subprocess.check_call(['echo',"a"*131071,"b"*131071],executable='/bin/bash',stdout=open("/dev/null","w"))
但是一个字符串arg不能超过131071字节。
这个问题与你的类似,但对于Windows。 正如在这种情况下,您可以通过避免shell=True选项来绕过任何shell限制。
否则,您可以像在该场景中那样提供一个到subprocess.Popen()的文件列表,并按照@Aaron Digulla的建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。