10

我正在尝试通过 shell 运行另一个脚本,该脚本使用一组修改后的环境变量。

def cgi_call(script, environ):
    pSCRIPT = subprocess.Popen(script, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
                        stdin=subprocess.PIPE, env=environ, shell=True)

    pc = pSCRIPT.communicate()

    status = "200 OK"
    headers = [('Content-Type',"text/html")]
    if pc[1] != '':
        raise RuntimeError, pc[1]
    else:
        rval = str(pc[0])

    return status, headers, rval

运行上面的代码后,我收到以下错误:

File "server/httpd.py", line 76, in DynamicServer
    status, headers, rval = handler(environ)
File "server/httpd.py", line 43, in handler
    status, headers, rval = cgi_call(srvpath+"../www/public_html"+environ["PATH_INFO"]+'index.py',environ)
File "server/httpd.py", line 21, in cgi_call
    stdin=subprocess.PIPE, env=environ, shell=True)
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
<type 'exceptions.TypeError'> execve() arg 3 contains a non-string value

传递环境变量时出现错误......我也尝试将它们作为字符串传递 - 它出错并说它需要一个映射对象。然而,实际上,传递的环境是一个映射对象......

问题是什么?

附加信息:我在 Ubuntu 12.04.1 上运行 Python 2.7

4

3 回答 3

8

复制评论中的答案,以便从“未回答”过滤器中删除此问题:

“...在 Python 2.x 中,键,可能还有值也需要是字节字符串。因此,如果您使用的是 unicode 字符串,请确保将它们编码为utf-8。此外,如果您默认使用 unicode 文字,请通过from __future__ import unicode_literals确保字典键的字符串文字以b字节文字而不是 unicode 文字为前缀。”

〜回答佩德罗罗马诺

于 2013-09-25T04:47:31.587 回答
2

我遇到了类似的问题。就我而言,问题是因为我只是在传递给的字典中传递了 python 本机类型env。考虑到这里的信息水平,这实际上可能与 OP 一致。考虑点

cgi_call(srvpath+"../www/public_html"+environ["PATH_INFO"]+'index.py',environ)

叫做。如果environ看起来像

{"variable": True}

那么True那里几乎肯定会是错误的原因。您可以在其位置使用字符串(字节字符串,根据其他答案)"true"

于 2017-12-20T21:53:17.077 回答
2

就我而言,环境变量的值是一个数字。将值视为带引号的字符串是我作为错误消息的解决方案, execve() arg 3 包含非字符串值。

- env:
  - VARIABLES: 1

- env:
  - VARIABLES: "1"
于 2019-11-12T02:43:23.550 回答