我正试图通过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
答案 0 :(得分:8)
从评论中复制答案,以便从&#34;未答复的&#34;中删除此问题。过滤器:
&#34; ... Python 2.x中的键,也可能是值,需要是字节字符串。因此,如果您使用的是unicode字符串,请确保将它们编码为utf-8
。此外,如果您通过from __future__ import unicode_literals
默认使用unicode文字,请确保字典键的字符串文字以b
为前缀,以字节文字而不是unicode文字。&#34;
答案 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"