2012-11-03 16 views
9

Değiştirilmiş ortam değişkenleri kümesini kullanarak kabuk aracılığıyla başka bir komut dosyası çalıştırmaya çalışıyorum.subprocess.Popen execve() arg 3 dize olmayan bir değer içeriyor

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 

Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki hatayı alıyorum:

ortam değişkenleri ... Ben de bir dize olarak iletmeden denedim geçerken hata geliyor
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 

- Bu hatalar dışarı ve bir eşleme nesnesine ihtiyacı olduğunu söylüyor. Ancak, olduğu gibi, iletilen ortam bir eşleme nesnesidir ...

Sorun nedir?

Ek Bilgi: Ben "Cevapsız" filtresinden Bu soruyu çıkarmak için yorumlardan cevabı Kopyalama Ubuntu 12.04.1

+6

'execve() arg 3 'ortamıdır. Geçirdiğiniz 'env' parametresinin yalnızca dizeleri içerdiğinden emin misiniz? –

+0

Evet, olumluyım. İlk kontrol ettiğim şey buydu. –

+10

Emin değilim, ama en azından anahtarların ve muhtemelen değerlerin de Python 2.x'te bayt dizeleri olması gerektiğine inanıyorum. Unicode dizeleri kullanıyorsanız, bunları 'utf-8' olarak kodladığınızdan emin olun. Ayrıca, unicode değişmezlerini varsayılan olarak '' __future__ import unicode_literals' üzerinden kullanıyorsanız, sözlük anahtarlarının dize değişmezlerinin 'b' ile unicode editörleri yerine bayt değişmezleri olmasını önleyin. –

cevap

7

üzerinde Python 2.7 çalıştırıyorum:

" ... tuşları ve olasılıkla da Python 2.x değerlerinin bayt dizeleri olması gerekir.Bu nedenle, eğer unicode dizeleri kullanıyorsanız, bunları utf-8 olarak kodladığınızdan emin olunuz.Ayrıca, unicode editörlerini varsayılan olarak from __future__ import unicode_literals aracılığıyla kullanıyorsanız Sözlük anahtarlarının dize değişmezleri,ile unicode editörleri yerine bayt değişmezleri olarak öneklenir. "

~ Ben benzer bir sorun koştu Pedro Romano

+0

Teşekkürler @DreadPirateShawn. –

0

başına cevap. Benim durumumda, sorun sadece python yerel türlerini env'a geçtiğim sözlükte geçirmekti. Bu, aslında bilgi düzeyi göz önünde bulundurulduğunda, OP'nin ne ile tutarlı olduğu olabilir.

'un çağrıldığı noktayı dikkate alın. environ

{"variable": True} 

benziyordu Eğer Sonra True yılında neredeyse kesinlikle Hatanın nedeni olacaktı. Dizgiyi (diğer cevaplara göre) (0t397), yerinde ("true") kullanabilirsiniz.

İlgili konular