间歇性"OSError: [Errno 7] 参数列表过长"问题,命令较短(约125个字符)

6 投票
1 回答
5966 浏览
提问于 2025-04-18 13:35

这段代码是在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 就会变得更长,最终它变得“太长”了。

撰写回答