2011-11-09 47 views
8

Tôi muốn nhận kết quả (báo cáo in) và trạng thái trả về từ một tiến trình con trăn cùng với hiển thị thông tin ghi nhật ký. Tôi đang sử dụng Python 2.5 trên Windows XP. Làm cách nào để tôi nhận được mã trả lại? Ở đây trong trích xuất này, tôi đọc đầu ra để tôi có thể chuyển hướng nó để hiển thị trong một wxPython TextCtrl trong một chủ đề riêng biệt.Giá trị trả về từ quy trình con của Python

self.myproc.poll()      
if self.myproc.returncode is None:    
    # Still running so check stdout 
    txt = self.myproc.stdout.read(self._readblock)  
    if txt:   
     # Add to UI's update queue 
     self._parent.AppendUpdate(txt)   
    else: 
     break  

Trả lời

7

Các mã trả được trả về bởi các poll cuộc gọi, và cũng có thể là (một lần poll không trở về None) truy cập thông qua thuộc tính returncode. Bạn đã sử dụng mã này trong mã của mình, vì vậy tôi không chắc vấn đề của bạn là gì.

Khi bạn muốn cập nhật điều khiển trong khi quá trình đang chạy, hãy sử dụng readline thay vì read: tùy chọn thứ hai sẽ chờ cho toàn bộ đầu ra xuất hiện, trong khi trước đó sẽ đợi ký tự dòng mới. Để cung cấp một ví dụ đầy đủ sử dụng tên biến của bạn:

from subprocess import Popen, PIPE 
self.myproc = Popen('dir /s', shell=True, stdout=PIPE, stderr=PIPE) 
while self.myproc.poll() == None: 
    self._parent.AppendUpdate(self.myproc.stdout.readline()) 
self._parent.AppendUpdate('Return code was ' + self.myproc.returncode) 

Lưu ý rằng bạn có thể muốn .strip() các readline kết quả vì nó sẽ chứa các ký tự xuống dòng.

Chỉnh sửa: Để giải quyết sự nhầm lẫn của bạn giữa đầu ra tập lệnh và mã trả lại, những điều sau đây. Đầu tiên, một kịch bản Python ở cấp mô-đun không thể trả về một giá trị: điều đó sẽ mang lại một lỗi cú pháp. Vì vậy, những gì bạn nên phân biệt giữa là đầu ra của kịch bản, và mã trả về nó mang lại.

Kết quả của tập lệnh nằm trong ví dụ trên được đọc bằng phương pháp self.myproc.stdout.readline. Mỗi khi quá trình bên ngoài tạo ra một dòng văn bản đã xuất, hãy gọi hàm đó sẽ lấy nó.

Mã trả về tuy nhiên (hoặc trạng thái thoát) là một số nguyên được chuyển từ tiến trình con sang tiến trình cha mẹ (của bạn), cho biết trạng thái của tiến trình con đã thoát. Trong Python, bạn làm điều này với hàm sys.exit. Thông thường nhất, khi giá trị này bằng 0, nó cho biết thành công; một giá trị khác không mô tả một số loại lỗi.

Say child process kịch bản của bạn trông như thế này:

import sys 
# Do some stuff 
print 'pass' # Gets to stdout 
sys.exit(0)  # Return code 

Thực thi tập tin bên ngoài này (chúng ta hãy gọi nó test.py) với lớp Popen, chúng tôi sẽ nhận được pass khi chúng ta đọc ra self.myproc.stdout, và 0 khi chúng ta đọc ra self.myproc.poll (hoặc self.myproc.returncode sau cuộc thăm dò đầu tiên).

Mục đích của mã trả về này là bạn không phải phân tích tất cả đầu ra của quá trình con để xác định xem nó có thành công trong công việc của mình hay không: bạn có thể tự do xác định mã thoát của riêng mình. Ví dụ: bạn có thể xem xét 0 để thành công, 1 là lỗi, 2 là loại đầu vào không hợp lệ được cung cấp, 9 lỗi không xác định, v.v. Bằng cách đó, bạn chỉ có thể giữ poll nhập quy trình và dựa trên mã thoát được trả về bởi cuộc thăm dò ý kiến ​​đó mà bạn biết trực tiếp nếu nó thành công. Lưu ý rằng đây là một chút ít áp dụng cho trường hợp của bạn như bạn cần đầu ra của quá trình con anyway, nhưng vẫn còn dễ dàng hơn để phân tích một số hơn một chuỗi để xác định thành công.

+0

lệnh trong quy trình của tôi là tệp python và trả về một giá trị ví dụ như một chuỗi như 'Pass' hoặc 'Fail'.Tôi chỉ nhận được các giá trị trả về như 0 hoặc 1 – user974168

+0

Ah, sau đó bạn chỉ cần phân tích dòng cuối cùng của 'stdout'. Mã trả về là dấu hiệu của điều kiện thoát của chương trình và là một số nguyên. – jro

+0

Tôi rất tiếc vì tôi không hiểu nhận xét của bạn. Vì lý luận của quá trình được gọi là như thế này def main(): a = 5 b = 6 c = a + b in c trở lại 'PASS' nếu __name__ == '__main__': main() Làm cách nào để nhận giá trị trả lại 'PASS' ở đây? – user974168

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