我在Linux3.16.0上运行Python3.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)), shell=True, executable='/bin/bash')
Traceback (most recent call last):
[...]
OSError: [Errno 7] Argument list too long
注意,Python限制与“实际使用”命令缓冲区xargs
报告大致相同。这表明xargs
在某种程度上足够聪明,可以从一个较小的限制开始,并根据需要增加它,但Python不是。
问题:
This其他问题与您的类似,但对于Windows。在这种情况下,您可以通过避免
shell=True
选项来绕过任何shell限制。否则,您可以提供一个文件列表给
subprocess.Popen()
,正如在该场景中所做的那样,并且正如@aron Digulla所建议的那样。单个字符串参数的最大大小限制为131072。它与python无关:
实际上是
MAX_ARG_STRLEN
决定单个字符串的最大大小:请参阅this discussion of ^{} ,在“参数数量和一个参数的最大长度”下,以及
unix.stackexchange
上的this question。你可以在
binfmts.h
中看到它:可以传递多个长度为
131071
的字符串:但是单个字符串arg不能超过131071字节。
相关问题 更多 >
编程相关推荐