我在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)), shell=True, executable='/bin/bash')
Traceback (most recent call last):
[...]
OSError: [Errno 7] Argument list too long
请注意,Python限制与“实际使用”命令缓冲区xargs
报告大致相同。这表明xargs
以某种方式足够聪明,可以从较小的限制开始并根据需要增加它,但Python却没有。
问题:
单个字符串参数的最大大小限制为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
您可以传递多个length的字符串131071
:
subprocess.check_call(['echo', "a"*131071,"b"*131071], executable='/bin/bash',stdout=open("/dev/null","w"))
但是单个字符串arg不能超过131071字节。
问题内容: 我正在使用子进程模块中的Popen函数来执行命令行工具: 我正在使用的工具将获取一个文件列表,然后处理该文件。在某些情况下,此文件列表可能会很长。有没有一种方法可以找到args参数可以达到的最大长度?将大量文件传递给该工具后,出现以下错误: 有找到这种最大长度的一般方法吗?我在msdn上找到了以下文章:命令提示符(Cmd。exe)命令行字符串限制,但我不想对值进行硬编码。我宁愿在运行时
在GET操作中,我们对查询参数的长度是否还有任何限制。前面我想我用的是255,这似乎增加了,但我不知道增加的限制是什么。 我面临的问题是,我尝试GETendpoint,如http://localhost:8080/data/ids=<5000 comma seaprated ids>,但失败了 但是具有500个ID(如http://localhost:8080/data/ids=<500 comm
Linux 也是众多操作系统之一,要想知道 Linux 是什么,首先得说一说什么是操作系统。 计算机是一台机器,它按照用户的要求接收信息、存储数据、处理数据,然后再将处理结果输出(文字、图片、音频、视频等)。计算机由硬件和软件组成: 硬件是计算机赖以工作的实体,包括显示器、键盘、鼠标、硬盘、CPU、主板等; 软件会按照用户的要求协调整台计算机的工作,比如 Windows、Linux、Mac OS、
为什么我的生产应用程序崩溃报告(位于“Android Vitals”/“ANR and crash”中,然后选择任何崩溃以查看堆栈跟踪)的Google Play控制台在堆栈跟踪中包含大量ORs? 这是什么意思?这12种方法中的哪一种实际上导致了崩溃?为什么报告这么不清楚? 有没有办法获得准确的方法名称,最好是报告中的行号?(我在“DeobFousation文件”下添加了映射文件)。
我收到一条PHP警告,上面说: PHP警告:POST内容长度2290848字节超过第0行未知中2097152字节的限制, 以下是我的配置: 在 /etc/php.ini 在/etc/httpd/conf/httpd中。形态 从上面看,我的帖子最大尺寸应该是2.5米。为什么在2M(2097152字节)的下限触发此警告?
问题内容: 当我在Linux上使用顶级终端程序时,看不到免费的结果。 我的期望是: 免费地图和清单。 我可以在顶部看到内存使用情况(Linux函数),或者 变得比过去更小。 睡眠开始了。 程序退出。 但是,只有在程序结束时,内存使用量才会变小。 您能解释一下自由功能的逻辑吗? 下面是我的代码。 谢谢。 问题答案: 内存分配到堆上。 当您在程序中请求一些内存时(使用new()或malloc()等),