/ / Как мога да комбинирам три подпроцеса.popen в един ред? - питън

Как мога да комбинирам три подпроцеса.popen в един ред? - питън

Понастоящем използвам

p1 = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "bash"], stdin=p1.stdout,    stdout=subprocess.PIPE)
p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE)
count = int(p3.stdout.read())

if count == 2:
print count
print "yes"
else:
print "fail"

За да проверите дали питънът ми вече работи или не. Той работи добре.

Искам обаче да знам дали мога да се съчетая p1 p2 и p3 в един ред.

опитах

p = subprocess.Popen(["ps ax | grep bash | wc -l"], stdout=subprocess.PIPE)

и още няколко, но не работи. Има ли начин да се съчетаят всички тези 3 в една линия?

Отговори:

1 за отговор № 1

Можете да използвате само тръби в стил "черупки" (|) ако преминете shell=True аргумент за ключова дума към Popen:

p = subprocess.Popen("ps ax | grep bash | wc -l", stdout=subprocess.PIPE, shell=True)

В противен случай целият низ, който предавате, се третира като името на изпълнимия файл, което ще се провали, тъй като нямате програма, наречена ps ax | grep bash | wc -l.

Освен това не трябва да предавате командата като списък shell=True, току-що преминете низ.

Една друга забележка: Вероятно трябва да коригирате командата си така, че да работи надеждно, така че grep bash самата команда не се отчита в изхода на ps ax | grep bash, Един трик за това е да се използва ps ax | grep [b]ash, Също така, използвайки shell=True може да завърши стартирането на баш инстанция, за да стартирате командата, така че може да се наложи да я използвате if count == 3 вместо if count == 2.

Като го направите съвсем:

p = subprocess.Popen("ps ax | grep [b]ash | wc -l", stdout=subprocess.PIPE, shell=True)

count = int(p.stdout.read())

if count == 2: # Or maybe 3?
print count
print "yes"
else:
print "fail"

Редактиране:

Тук изход от изпълнение на различни версии на кода на моята машина

>>> p1 = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "bash"], stdin=p1.stdout,    stdout=subprocess.PIPE)
>>> p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE); p3.stdout.read()
"42n"
>>> p1 = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "bash"], stdin=p1.stdout,    stdout=subprocess.PIPE)
>>> p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE); p3.stdout.read()
"42n"
>>> p1 = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "bash"], stdin=p1.stdout,    stdout=subprocess.PIPE)
>>> p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE); p3.stdout.read()
"42n"
>>> p1 = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "bash"], stdin=p1.stdout,    stdout=subprocess.PIPE)
>>> p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE); p3.stdout.read()
"42n"
>>> p1 = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "bash"], stdin=p1.stdout,    stdout=subprocess.PIPE)
>>> p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE); p3.stdout.read()
"42n"
>>> p = subprocess.Popen("ps -ef | grep bash | wc -l ", stdout=subprocess.PIPE, shell=True) ; print("".join(p.stdout.readlines()))
44

>>> p = subprocess.Popen("ps -ef | grep bash | wc -l ", stdout=subprocess.PIPE, shell=True) ; print("".join(p.stdout.readlines()))
44

>>> p = subprocess.Popen("ps -ef | grep bash | wc -l ", stdout=subprocess.PIPE, shell=True) ; print("".join(p.stdout.readlines()))
44

>>> p = subprocess.Popen("ps -ef | grep [b]ash | wc -l ", stdout=subprocess.PIPE, shell=True) ; print("".join(p.stdout.readlines()))
42

>>> p = subprocess.Popen("ps -ef | grep [b]ash | wc -l ", stdout=subprocess.PIPE, shell=True) ; print("".join(p.stdout.readlines()))
42

>>> p = subprocess.Popen("ps -ef | grep [b]ash | wc -l ", stdout=subprocess.PIPE, shell=True) ; print("".join(p.stdout.readlines()))
42

0 за отговор № 2

Ето очевидния отговор. Всичко, което направих, бе да замени втория p1 и p2 с първата задача.

p3 = subprocess.Popen(["wc", "-l"], stdin=subprocess.Popen(["grep", "bash"], 
stdin=subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE).stdout, 
stdout=subprocess.PIPE).stdout, stdout=subprocess.PIPE)