Ben kullanmak istiyorum subprocess.check_output()
ile ps -A | grep 'process_name'
. Çeşitli çözümler denedim ama şimdiye kadar hiçbir şey işe yaramadı. Birisi bana nasıl yapılacağını söyleyebilir mi?
Ben kullanmak istiyorum subprocess.check_output()
ile ps -A | grep 'process_name'
. Çeşitli çözümler denedim ama şimdiye kadar hiçbir şey işe yaramadı. Birisi bana nasıl yapılacağını söyleyebilir mi?
Yanıtlar:
subprocess
Modülle birlikte bir boru kullanmak için geçmeniz gerekir shell=True
.
Ancak, bu çeşitli nedenlerle gerçekten tavsiye edilmez, en azından güvenlik değildir. Bunun yerine, ps
ve grep
işlemlerini ayrı ayrı oluşturun ve çıktıyı birinden diğerine geçirin, şöyle:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
Bununla birlikte, özel durumunuzda, basit çözüm çağrı yapmak subprocess.check_output(('ps', '-A'))
ve sonra str.find
çıkıştır.
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
sadece grep tarafından hiçbir şey bulunmadığı anlamına gelir, bu yüzden normal davranıştır.
ps.wait()
zaten sahip olduğumuzda neden ihtiyacımız var? ps.wait.__doc__
çocuğun sona ermesini bekler, ancak çocuğun içeriği zaten output
değişkene yerleştirilmiş gibi görünür
string.find
, lehine reddedilen str.find
(yani nesneler find
üzerindeki yöntem str
).
grep
erken ölürse; ps
OS boru arabelleğini doldurmak için yeterli çıktı üretiyorsa süresiz olarak askıda kalabilir (çünkü ps.stdout.close()
ana öğeyi aramadıysanız). Bundan kaçınmak için başlangıç sırasını değiştirin
Veya alt işlem nesnelerinde iletişim yöntemini her zaman kullanabilirsiniz.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
Communications yöntemi, standart çıktının ve standart hatanın bir demetini döndürür.
communicate
daha iyidir wait
. Orada böyle uyarı:. "Bu stdout'u = BORU ve / veya stderr'yi = BORU ve çocuk işlemini kullanırken kilitlenmeye bir boruya yeterli çıktı üretir OS boru tampon bekliyor engeller daha fazla veri kabul etmek öyle Kullanım iletişim () için bundan kaçının. "
Alt süreç kullanarak bir boru hattı kurma hakkındaki belgelere bakın: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Aşağıdaki kod örneğini test etmedim ama kabaca ne istediğinizi olmalı:
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 çözümü iyidir, ancak SHELL = TRUE yerine shlex kullanmak için bir iyileştirme ekleyeceğim. aşağıda im grepping out Sorgu zamanları
#!/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)
Boru işlevselliğini sh.py'de deneyebilirsiniz :
import sh
print sh.grep(sh.ps("-ax"), "process_name")
Python 3.5 Sonrası şunları da kullanabilirsiniz:
import subprocess
f = open('test.txt', 'w')
process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
f.write(process.stdout)
f.close()
Komutun yürütülmesi engelleniyor ve çıktı process.stdout içinde olacak .