2012-11-03 11 views
9

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

+6

'execve() arg 3' jest środowiskiem. Czy jesteś pewien, że przekazywany parametr "env" zawiera tylko ciągi? –

+0

Tak, jestem pozytywny. To była pierwsza rzecz, którą sprawdziłem. –

+10

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. –

Odpowiedz

7

Kopiowanie odpowiedzi z uwagami w celu usunięcia tej kwestii z „Nieodebrane” Filtr:

”na ... klucze i ewentualnie również wartości w Pythonie 2.x muszą być ciągami bajtowymi, więc jeśli używasz ciągów unicode, upewnij się, że kodujesz je do utf-8. Ponadto, jeśli korzystasz z literałów Unicode domyślnie przez from __future__ import unicode_literals upewnij się, że Literały łańcuchowe dla kluczy słownika są poprzedzone prefiksem b, aby były literami bajtów zamiast literałów unicode. "

~ odpowiedź za Pedro Romano

+0

Dzięki @DreadPirateShawn. –

0

wpadłem na podobny problem. W moim przypadku problem polegał na tym, że właśnie przekazywałem rodzime typy Pythona do słownika przekazanego do env. Może to faktycznie być zgodne z tym, co OP, biorąc pod uwagę poziom informacji tutaj. Należy rozważyć moment, w którym wywoływana jest funkcja

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

. Jeśli environ wyglądało

{"variable": True} 

Następnie True tam prawie na pewno być przyczyną błędu. Możesz użyć ciągu (bytestring, zgodnie z inną odpowiedzią) "true" w jego miejsce.