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

Python subprocess.Popen execve()arg 3包含非字符串值,python,environment-variables,popen,subprocess,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.communica

我试图通过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
文件“server/httpd.py”,第76行,在DynamicServer中
状态,标题,rval=handler(环境)
处理程序中第43行的文件“server/httpd.py”
状态,标题,rval=cgi_调用(srvpath++./www/public_html“+environ[“PATH_INFO”]+'index.py',environ)
cgi_调用中第21行的文件“server/httpd.py”
stdin=subprocess.PIPE,env=environ,shell=True)
文件“/usr/lib/python2.7/subprocess.py”,第679行,在__
错误读取,错误写入)
文件“/usr/lib/python2.7/subprocess.py”,第1249行,在执行子进程中
引发子对象异常
execve()arg 3包含非字符串值
传递环境变量时出错。。。我还尝试将它们作为字符串传递—它会出错并说它需要一个映射对象。但是,实际上,正在传递的环境是一个映射对象

有什么问题

其他信息:
我正在Ubuntu 12.04.1上运行Python 2.7,复制评论中的答案,以便从“未回答”过滤器中删除此问题:

“…Python2.x中的键以及可能的值都需要是字节字符串。因此,如果您使用的是unicode字符串,请确保将其编码为
utf-8
。此外,如果默认情况下通过uuu future uuuu import unicode u literals使用unicode文字,请确保字典键的字符串文字前缀为
b
,以作为字节文字,而不是unicode文字。”


>回答< /p>> p>我遇到了一个类似的问题。在我的例子中,问题是因为我只是在Python原生类型中通过了我传递到Env的字典。这实际上与OP是一致的,考虑到这里的信息级别。

cgi_call(srvpath+"../www/public_html"+environ["PATH_INFO"]+'index.py',environ)
调用。如果

{"variable": True}

然后那里的
True
几乎肯定是错误的原因。您可以使用字符串(根据另一个答案,是bytestring)
“True”

在我的例子中,环境变量的值是一个数字。 将值视为字符串并引用是我的解决方案,因为错误消息execve()arg 3包含一个非字符串值


execve()arg 3
是环境。您确定要传递的
env
参数只包含字符串吗?是的,我是肯定的。这是我检查的第一件事。我不确定,但我相信至少Python 2.x中的键,可能还有值都需要是字节字符串。因此,如果您使用unicode字符串,请确保您编码另外,如果您在默认情况下通过来自未来的导入unicode文本来使用unicode文本,请确保字典键的字符串文本前缀为
b
,以作为字节文本而不是unicode文本。我还没有尝试过,我会看看这是否是问题所在。嘿,谢谢!帮助很简单非常感谢!它现在按预期运行!
- env:
  - VARIABLES: 1
- env:
  - VARIABLES: "1"