subprocess.Popen execve()arg 3包含非字符串值

时间:2012-11-03 21:28:51

标签: python environment-variables popen subprocess

我正试图通过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

3 个答案:

答案 0 :(得分:8)

从评论中复制答案,以便从&#34;未答复的&#34;中删除此问题。过滤器:

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

〜每Pedro Romano

回答

答案 1 :(得分:2)

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

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

被调用。如果environ看起来像

{"variable": True}

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

答案 2 :(得分:0)

在我的情况下,

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

来自

- env:
  - VARIABLES: 1

- env:
  - VARIABLES: "1"