Tôi đang cố gắng chạy một tập lệnh khác thông qua trình bao, sử dụng tập hợp các biến môi trường đã sửa đổi.subprocess.Popen execve() arg 3 chứa giá trị không phải là chuỗi
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
Sau khi chạy đoạn mã trên, tôi nhận được lỗi sau:
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ỗi xảy ra khi đi qua các biến môi trường ... Tôi cũng đã thử đi qua chúng như là một chuỗi - Nó lỗi và nói rằng nó cần một đối tượng lập bản đồ. Tuy nhiên, vì nó là, môi trường được truyền IS là một đối tượng ánh xạ ...
Vấn đề là gì?
Thông tin bổ sung: Tôi đang chạy Python 2.7 trên Ubuntu 12.04.1
'execve() arg 3' là môi trường. Bạn có chắc là tham số 'env' mà bạn đang truyền chỉ chứa các chuỗi không? –
Vâng, tôi rất tích cực. Đó là điều đầu tiên tôi kiểm tra. –
Tôi không chắc chắn, nhưng tôi tin rằng ít nhất là các khóa, và có thể các giá trị cũng có, trong Python 2.x cần phải là chuỗi byte. Vì vậy, nếu bạn đang sử dụng chuỗi unicode, hãy chắc chắn bạn mã hóa chúng thành 'utf-8'. Ngoài ra, nếu bạn đang sử dụng các chữ cái unicode theo mặc định thông qua 'from __future__ import unicode_literals', hãy chắc chắn rằng các chuỗi ký tự của bạn cho các khóa từ điển được bắt đầu bằng' b' thành byte literals thay vì chữ unicode. –