间歇性"OSError: [Errno 7] 参数列表过长"问题,命令较短(约125个字符)
这段代码是在Linux系统下,使用apache2和mod_wsgi运行时,有时候会出现以下输出。
notes.py
cmd_list = [
'abc_generate_pdf',
'--cdb-url-prefix', model.config('cdb_url_prefix'),
'--request-cid', request_cid,
]
log.info("About to run: {!r}".format(cmd_list))
subprocess.Popen(cmd_list)
...
2014-07-16 11:03:44,779 INFO pid:17925,140353357215488 abc.webapp.check.notes:198:approval_revoke About to run: ['abc_generate_pdf', '--cdb-url-prefix', 'xxxxdev', '--request-cid', u'xxxxx_xxx_2014-07-15_16.12.50.108807_685932a62c7c6226987acdeda367dbc3']
2014-07-16 11:03:45,250 ERROR pid:17925,140353357215488 abc.webapp.check.notes:208:approval_revoke Unknown error; approval not updated.
Traceback (most recent call last):
File "/home/abc/abc/webapp/check/notes.py", line 199, in approval_revoke
subprocess.Popen(cmd_list)
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 7] Argument list too long
输出内容经过了一些匿名处理,但字符数是准确的。
这个问题似乎是在网络服务器运行了一段很长时间后才会出现,重启服务器后问题又会消失。不过,具体是什么原因导致的很难确定。
我为什么会遇到这个错误?我该怎么做才能避免它呢?
这个问题和Python OSError no 7(参数列表太长)在Linux中的问题很相似,但没有一个令人满意的答案。
补充说明:我还要提到,这个问题在纯Python的werkzeug服务器上也会发生。
1 个回答
14
我们之前也遇到过类似的问题,困扰了我们一段时间。今天,我们终于找到了根本原因。
这个错误信息有点误导,它并不是说命令行的“参数”太长,而是操作系统传递给命令的环境变量太长。在这个情况下,就是 Python 的 os.environ。在我们的代码中,有一行代码:
os.environ['PATH'] = ':'.join([os.environ['PATH'], self.clitoolsdir])
这行代码是一个类的 __init__()
方法的一部分。每次创建一个新对象时,os.environ
就会变得更长,最终它变得“太长”了。