2012-11-03 11 views
9

Sto provando a eseguire un altro script tramite la shell, che utilizza un insieme modificato di variabili di ambiente.subprocess.Popen execve() arg 3 contiene un valore non stringa

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 

Dopo aver eseguito il codice di cui sopra, ottengo il seguente errore:

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 

L'errore viene quando passando le variabili di ambiente ... Ho anche provato passandoli come stringa - esso errori fuori e dice che ha bisogno di un oggetto di mappatura. Tuttavia, così com'è, l'ambiente passato è un oggetto di mappatura ...

Qual è il problema?

Informazioni aggiuntive: Sono in esecuzione Python 2.7 su Ubuntu 12.04.1

+6

'execve() arg 3' è l'ambiente. Sei sicuro che il parametro 'env' che stai passando contiene solo stringhe? –

+0

Sì, sono positivo. Questa è stata la prima cosa che ho controllato. –

+10

Non ne sono sicuro, ma credo che almeno le chiavi, e possibilmente anche i valori, in Python 2.x debbano essere stringhe di byte. Quindi se stai usando stringhe unicode, assicurati di codificarle su 'utf-8'. Inoltre, se si utilizzano letterali unicode per impostazione predefinita tramite 'da __future__ import unicode_literals' assicurarsi che i valori letterali delle stringhe per le chiavi del dizionario siano preceduti da' b' come letterali byte anziché letterali unicode. –

risposta

7

Copiare la risposta dai commenti al fine di rimuovere questa domanda dal filtro "Senza risposta":

" ... il le chiavi, e possibilmente anche i valori, in Python 2.x devono essere stringhe di byte. Quindi, se stai utilizzando stringhe Unicode, assicurati di codificarle su utf-8. Inoltre, se utilizzi valori letterali Unicode per impostazione predefinita tramite from __future__ import unicode_literals assicurati che il tuo i valori letterali stringa per i tasti del dizionario hanno come prefisso lo b come letterali di byte invece di valori letterali Unicode. "

~ risposta per Pedro Romano

+0

Grazie a @DreadPirateShawn. –

0

mi sono imbattuto in un problema simile. Nel mio caso, il problema era che stavo passando dei tipi nativi di python nel dizionario che ho passato a env. Questo potrebbe effettivamente essere coerente con ciò che l'OP, dato il livello di informazioni qui. Considerare il punto in cui

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

viene chiamato. Se environ sembrava

{"variable": True} 

Poi il True in ci sarebbe quasi certamente la causa dell'errore. È possibile utilizzare la stringa (testando, come per l'altra risposta) "true" al suo posto.

Problemi correlati