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