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
'execve() arg 3' è l'ambiente. Sei sicuro che il parametro 'env' che stai passando contiene solo stringhe? –
Sì, sono positivo. Questa è stata la prima cosa che ho controllato. –
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. –