Понастоящем използвам
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)