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
25
keystone/common/openssl. p29
keystone/tests/test_cert_setup. p
25
keystone/chung/openssl. pyUnescape thoát xem tệp
@ -18,6 +18,7 @@ import os
from keystone.common import environment
from keystone.common import utils
from keystone import config
from keystone.i18n import _LI, _LE
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
0import 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]
2import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
3@ -18,6 +18,7 @@ import os
0@ -18,6 +18,7 @@ import os
1@ -18,6 +18,7 @@ import os
2@ -18,6 +18,7 @@ import os
3@ -18,6 +18,7 @@ import os
4@ -18,6 +18,7 @@ import os
5@ -18,6 +18,7 @@ import os
6@ -18,6 +18,7 @@ import os
7@ -18,6 +18,7 @@ import os
8@ -18,6 +18,7 @@ import os
9from keystone.common import environment
0from keystone.common import environment
1from keystone.common import environment
2from keystone.common import environment
3from keystone.common import environment
4from keystone.common import environment
5from keystone.common import environment
6from keystone.common import environment
7from keystone.common import environment
8from keystone.common import environment
9from keystone.common import utils
0__from keystone.common import utils
1from keystone.common import utils
2_____77___7729
keystone/kiểm tra/test_cert_setup. pyUnescape thoát xem tệp
from keystone.common import utils
9from keystone import config
0from keystone import config
1from keystone import config
2from keystone import config
3from keystone.common import environment
from keystone import config
5from keystone import config
6from keystone import config
7 from keystone import config
8from keystone import config
9from keystone.i18n import _LI, _LE
0from keystone.i18n import _LI, _LE
1from keystone.i18n import _LI, _LE
2from keystone.i18n import _LI, _LE
3from keystone.i18n import _LI, _LE
4from keystone.i18n import _LI, _LE
5from keystone.i18n import _LI, _LE
6from keystone.i18n import _LI, _LE
7from keystone.i18n import _LI, _LE
8from keystone.i18n import _LI, _LE
3
import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
00import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
01import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
02import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
03___104from keystone.i18n import _LI, _LE
6import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
06import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
07import subprocess
process = subprocess.Popen[['echo', '"Hello stdout"'], stdout=subprocess.PIPE]
stdout = process.communicate[][0]
print 'STDOUT:{}'.format[stdout]
08_____8