Tôi muốn sử dụng subprocess.check_output()
với ps -A | grep 'process_name'
. Tôi đã thử các giải pháp khác nhau nhưng cho đến nay không có gì hiệu quả. Ai đó có thể hướng dẫn tôi làm thế nào để làm điều đó?
Tôi muốn sử dụng subprocess.check_output()
với ps -A | grep 'process_name'
. Tôi đã thử các giải pháp khác nhau nhưng cho đến nay không có gì hiệu quả. Ai đó có thể hướng dẫn tôi làm thế nào để làm điều đó?
Câu trả lời:
Để sử dụng một đường ống với subprocess
mô-đun, bạn phải vượt qua shell=True
.
Tuy nhiên, điều này không thực sự được khuyến khích vì nhiều lý do, không ít trong số đó là bảo mật. Thay vào đó, hãy tạo ps
và grep
xử lý riêng rẽ và chuyển đầu ra từ cái này sang cái khác, như vậy:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
Tuy nhiên, trong trường hợp cụ thể của bạn, giải pháp đơn giản là gọi subprocess.check_output(('ps', '-A'))
và sau đó str.find
là đầu ra.
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
chỉ có nghĩa là không tìm thấy gì bởi grep, vì vậy đó là hành vi bình thường.
ps.wait()
cho khi chúng ta đã có đầu ra. ps.wait.__doc__
Chờ đứa trẻ chấm dứt nhưng nội dung của đứa trẻ dường như đã được đặt vào output
biến
string.find
, điều này không được ủng hộ str.find
(nghĩa là phương thức find
trên str
các đối tượng).
grep
chết sớm; ps
có thể bị treo vô thời hạn nếu nó tạo ra đầu ra đủ để lấp đầy bộ đệm ống hệ điều hành của nó (vì bạn chưa gọi ps.stdout.close()
cha mẹ). Hoán đổi thứ tự bắt đầu, để tránh nó
Hoặc bạn luôn có thể sử dụng phương thức giao tiếp trên các đối tượng của quy trình con.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
Phương thức giao tiếp trả về một tuple của đầu ra tiêu chuẩn và lỗi tiêu chuẩn.
Xem tài liệu về cách thiết lập một đường ống bằng cách sử dụng quy trình con: http : //docs.python.org/2/l Library / sub process.html # report-shell-pipeline
Tôi đã không kiểm tra ví dụ mã sau đây nhưng nó sẽ gần như là những gì bạn muốn:
query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close() # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]
Giải pháp JKALAVIS là tốt, tuy nhiên tôi sẽ thêm một cải tiến để sử dụng shlex thay vì SHELL = TRUE. bên dưới tôi đang rút ra thời gian truy vấn
#!/bin/python
import subprocess
import shlex
cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)