subprocess.Popen execve() arg 3 contains a non-string value

断了今生、忘了曾经 提交于 2021-01-27 01:42:51

问题


I'm trying to trying to run another script via the shell, that uses a modified set of environment variables.

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

After running the code above, I get the following error:

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

The error comes when passing the environment variables... I've also tried passing them as a string - It errors out and says that it needs a mapping object. However, as it is, the environ being passed IS a mapping object...

What is the problem?

Additional Information: I am running Python 2.7 on Ubuntu 12.04.1


回答1:


Copying the answer from the comments in order to remove this question from the "Unanswered" filter:

"...the keys, and possibly the values also, in Python 2.x need to be byte strings. So if you are using unicode strings, make sure you encode them to utf-8. Also, if you are using unicode literals by default via from __future__ import unicode_literals make sure your string literals for the dictionary keys are prefixed with b to be byte literals instead of unicode literals."

~ answer per Pedro Romano




回答2:


I ran into a similar problem. In my case, the problem was because I was just passing python native types in the dictionary I passed to env. This could actually be consistent with what the OP, given the level of information here. Consider the point where

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

is called. If environ looked like

{"variable": True}

Then the True in there would almost certainly be the cause of the error. You can use the string (bytestring, as per the other answer) "true" in its place.




回答3:


in my case, the environment variables's value was a number. treating the value as string with quoting was my soluction as the error message, execve() arg 3 contains a non-string value.

from

- env:
  - VARIABLES: 1

to

- env:
  - VARIABLES: "1"


来源:https://stackoverflow.com/questions/13213676/subprocess-popen-execve-arg-3-contains-a-non-string-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!