Python subprocess.Popen execve()arg 3包含非字符串值
我试图通过shell运行另一个脚本,它使用一组修改过的环境变量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
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原生类型中通过了我传递到
调用。如果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"