Próbuję próbować uruchomić inny skrypt za pośrednictwem powłoki, która używa zmodyfikowanego zestawu zmiennych środowiskowych.subprocess.Popen execve() arg 3 zawiera wartość inną niż łańcuchowa
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
Po uruchomieniu powyższy kod, pojawia się następujący błąd:
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
Błąd pojawia się, gdy przechodząc zmienne środowiskowe ... Próbowałem zostały również przekazując je jako ciąg - to błędy i mówi, że potrzebuje obiektu odwzorowania. Jednak, tak jak jest, przekazane środowisko jest obiektem odwzorowania ...
Na czym polega problem?
Dodatkowe informacje: Używam Python 2.7 na Ubuntu 12.04.1
'execve() arg 3' jest środowiskiem. Czy jesteś pewien, że przekazywany parametr "env" zawiera tylko ciągi? –
Tak, jestem pozytywny. To była pierwsza rzecz, którą sprawdziłem. –
Nie jestem pewien, ale uważam, że przynajmniej klucze, a być może również wartości, w Pythonie 2.x muszą być ciągami bajtów. Więc jeśli używasz ciągów Unicode, upewnij się, że je kodujesz do 'utf-8'. Ponadto, jeśli używasz literałów unikodowych domyślnie poprzez 'from __future__ importuj unicode_literals' upewnij się, że twoje ciągi literowe dla kluczy słownika są poprzedzone przedrostkiem' b' jako literały bajtów zamiast literałów unicode. –