ฉันต้องการที่จะใช้กับsubprocess.check_output()
ps -A | grep 'process_name'
ฉันลองใช้วิธีแก้ไขปัญหาต่าง ๆ แต่ก็ยังไม่มีอะไรทำงาน ใครช่วยแนะนำฉันให้ทำอย่างไร
ฉันต้องการที่จะใช้กับsubprocess.check_output()
ps -A | grep 'process_name'
ฉันลองใช้วิธีแก้ไขปัญหาต่าง ๆ แต่ก็ยังไม่มีอะไรทำงาน ใครช่วยแนะนำฉันให้ทำอย่างไร
คำตอบ:
หากต้องการใช้ท่อที่มีโมดูลที่คุณต้องผ่านsubprocess
shell=True
อย่างไรก็ตามนี่ไม่แนะนำให้เลือกด้วยเหตุผลหลายประการไม่น้อยกว่านั้นคือความปลอดภัย ให้สร้างps
และgrep
ประมวลผลแยกจากกันและไพพ์เอาต์พุตจากหนึ่งไปอีกอันแทนดังนี้:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
อย่างไรก็ตามในกรณีเฉพาะของคุณวิธีแก้ปัญหาอย่างง่าย ๆ ก็คือการโทรsubprocess.check_output(('ps', '-A'))
แล้วstr.find
ส่งสัญญาณออก
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
เพียงหมายความว่า grep ไม่พบสิ่งใดดังนั้นจึงเป็นพฤติกรรมปกติ
ps.wait()
เมื่อเรามีเอาต์พุตอยู่แล้ว ps.wait.__doc__
รอให้เด็กเลิก แต่เนื้อหาของเด็กดูเหมือนอยู่ในoutput
ตัวแปรแล้ว
string.find
ซึ่งได้รับการคัดค้านในความโปรดปรานของstr.find
(เช่นวิธีการfind
เกี่ยวกับstr
วัตถุ)
grep
ตายก่อนกำหนด; ps
อาจแฮงค์ไปเรื่อย ๆ ถ้ามันสร้างผลผลิตเพียงพอที่จะเติมบัฟเฟอร์ท่อของ OS (เพราะคุณไม่ได้เรียกps.stdout.close()
ในผู้ปกครอง) สลับลำดับเริ่มต้นเพื่อหลีกเลี่ยง
หรือคุณสามารถใช้วิธีการสื่อสารกับวัตถุ subprocess
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
วิธีการสื่อสารจะคืนค่า tuple ของเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐาน
ดูเอกสารประกอบเกี่ยวกับการตั้งค่าไปป์ไลน์โดยใช้กระบวนการย่อย: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
ฉันยังไม่ได้ทดสอบตัวอย่างโค้ดต่อไปนี้ แต่ควรเป็นอย่างที่คุณต้องการ:
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]
วิธีแก้ปัญหาของ JKALAVIS นั้นดี แต่ฉันจะเพิ่มการปรับปรุงเพื่อใช้ shlex แทน SHELL = TRUE ด้านล่างฉัน grepping out เวลาค้นหา
#!/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)
คุณสามารถลองใช้ฟังก์ชั่นไปป์ได้ที่sh.py :
import sh
print sh.grep(sh.ps("-ax"), "process_name")
หลังจากPython 3.5คุณสามารถใช้:
import subprocess
f = open('test.txt', 'w')
process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
f.write(process.stdout)
f.close()
การดำเนินการของคำสั่งจะถูกสกัดกั้นและการส่งออกจะอยู่ในprocess.stdout