2012-11-03 16 views
9

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

+6

'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? –

+0

Vâng, tôi rất tích cực. Đó là điều đầu tiên tôi kiểm tra. –

+10

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

Trả lời

7

Sao chép câu trả lời từ các ý kiến ​​để loại bỏ câu hỏi này khỏi "Chưa trả lời" bộ lọc:

" ... các các khóa, và có thể cả các giá trị, trong Python 2.x cần phải là các chuỗi byte Vì vậy, nếu bạn đang sử dụng các chuỗi unicode, hãy chắc chắn rằng 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ữ unicode theo mặc định thông qua from __future__ import unicode_literals hãy đảm bảo chuỗi ký tự cho các khóa từ điển được bắt đầu bằng b thành các byte byte thay cho các chữ cái unicode. "

~ answer per Pedro Romano

+0

Cảm ơn @DreadPirateShawn. –

0

Tôi gặp sự cố tương tự. Trong trường hợp của tôi, vấn đề là vì tôi chỉ đang truyền các kiểu bản địa trăn trong từ điển mà tôi đã chuyển đến env. Điều này thực sự có thể phù hợp với những gì OP, đưa ra mức độ thông tin ở đây. Xem xét điểm mà tại đó

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

được gọi. Nếu environ trông giống như

{"variable": True} 

Sau đó True trong đó sẽ gần như chắc chắn là nguyên nhân của lỗi. Bạn có thể sử dụng chuỗi (bytestring, theo câu trả lời khác) "true" ở vị trí của nó.

Các vấn đề liên quan