Thiết bị xuất chuẩn chuyển hướng quy trình con python

Khi tôi khởi chạy một quy trình unix đang chạy dài trong tập lệnh python, nó sẽ đợi cho đến khi quá trình kết thúc và chỉ sau đó tôi mới nhận được đầu ra hoàn chỉnh của chương trình của mình. Điều này thật khó chịu nếu tôi đang chạy một tiến trình mất một lúc để hoàn thành. Và tôi muốn chụp đầu ra và hiển thị nó theo cách đẹp mắt với định dạng rõ ràng

Sử dụng thư viện quy trình con và shlex

Python có triết lý “bao gồm pin”. Tôi đã sử dụng 2 thư viện tiêu chuẩn để giải quyết vấn đề này

import subprocess
import shlex

  • quy trình con—​Hoạt động với các quy trình bổ sung
  • shlex—​Phân tích từ vựng cú pháp kiểu shell

quy trình con. giáo hoàng

Để chạy một quy trình và đọc tất cả đầu ra của nó, hãy đặt giá trị thiết bị xuất chuẩn thành PIPE và gọi giao tiếp[]

import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]

Đoạn script trên sẽ đợi quá trình hoàn tất và sau đó nó sẽ hiển thị đầu ra. Vì vậy, bây giờ chúng ta sẽ đọc từng dòng thiết bị xuất chuẩn và hiển thị nó trong bảng điều khiển cho đến khi nó hoàn thành quy trình

output = process.stdout.readline[]

Điều này sẽ đọc một dòng từ thiết bị xuất chuẩn

process.poll[]

Phương thức poll[] sẽ trả về

  • mã thoát nếu quá trình hoàn tất
  • Không có nếu quá trình vẫn đang chạy

while True:
        output = process.stdout.readline[]
        if output == '' and process.poll[] is not None:
            break
        if output:
            print output.strip[]
    rc = process.poll[]

Ở trên sẽ lặp lại và tiếp tục đọc thiết bị xuất chuẩn và kiểm tra mã trả về và hiển thị đầu ra trong thời gian thực

Tôi gặp một vấn đề nữa trong việc phân tích cú pháp các lệnh shell để chuyển nó sang popen khi tôi đặt shell=False. Dưới đây là một lệnh ví dụ

Hiển thị tất cả các thay đổi Bỏ qua khoảng trắng khi so sánh các dòng Bỏ qua các thay đổi về số lượng khoảng trắng Bỏ qua các thay đổi về khoảng trắng tại EOL

Hiển thị số liệu thống kê Tải xuống tệp vá Tải xuống tệp khác

  1. 25

      keystone/common/openssl. p
  2. 29

      keystone/tests/test_cert_setup. p

25

keystone/chung/openssl. py

Unescape thoát xem tệp

@ -18,6 +18,7 @@ import osfrom keystone.common import environmentfrom keystone.common import utilsfrom keystone import configfrom keystone.i18n import _LI, _LE

import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
0
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
1
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
2
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
3@ -18,6 +18,7 @@ import os0@ -18,6 +18,7 @@ import os1@ -18,6 +18,7 @@ import os2@ -18,6 +18,7 @@ import os3@ -18,6 +18,7 @@ import os4@ -18,6 +18,7 @@ import os5@ -18,6 +18,7 @@ import os6@ -18,6 +18,7 @@ import os7@ -18,6 +18,7 @@ import os8@ -18,6 +18,7 @@ import os9from keystone.common import environment0from keystone.common import environment1from keystone.common import environment2from keystone.common import environment3from keystone.common import environment4from keystone.common import environment5from keystone.common import environment6from keystone.common import environment7from keystone.common import environment8from keystone.common import environment9from keystone.common import utils0__from keystone.common import utils1from keystone.common import utils2_____77___77

29

keystone/kiểm tra/test_cert_setup. py

Unescape thoát xem tệp

from keystone.common import utils9from keystone import config0from keystone import config1from keystone import config2from keystone import config3from keystone.common import environmentfrom keystone import config5from keystone import config6from keystone import config7 from keystone import config8from keystone import config9from keystone.i18n import _LI, _LE0from keystone.i18n import _LI, _LE1from keystone.i18n import _LI, _LE2from keystone.i18n import _LI, _LE3from keystone.i18n import _LI, _LE4from keystone.i18n import _LI, _LE5from keystone.i18n import _LI, _LE6from keystone.i18n import _LI, _LE7from keystone.i18n import _LI, _LE8from keystone.i18n import _LI, _LE3

import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
00
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
01
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
02
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
03___104from keystone.i18n import _LI, _LE6
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
06
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
07
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
08_____8

Chủ Đề