Я пытаюсь написать утилиту, которая будет бесшовно передавать неограниченное количество команд вместе в Python. Это то, что я придумал до сих пор, после the documentation on piping in subprocess
:Решение цепочки процессов в Python
from subprocess import Popen, PIPE, STDOUT
def taskchain(argset, result=STDOUT):
lastprocess = None
for index, args in enumerate(argset): # expected to be a list containing lists
process = Popen(args, stdout=stdout if index == (len(argset)-1) else PIPE,
stdin=None if lastprocess is None else lastprocess.stdout)
if lastprocess is not None:
lastprocess.stdout.close()
lastprocess = process
if stdout == PIPE:
return lastprocess.communicate()[0]
else:
lastprocess.wait()
Обратите внимание, что я не использую shell=True
для того, чтобы мы надеемся избежать проблем безопасности там.
К сожалению, это не работает, так как я получаю:
OSError: [Errno 9] Baf file descriptor
Я не уверен, что, кажется, терпит неудачу. Может ли кто-нибудь помочь мне написать метод для реализации цепочки процессов для неограниченного количества подпроцессов?
(Используйте случай, как это:. taskchain([('ps', 'aux'), ('grep', 'python'), ('cut', '-b', '1')])
)
Стиль примечание: в 'argset.index (аргументы)' что-то * * Я действительно не могу смотреть ... это больно! Если вы перебираете простой «argset», то вы * не должны * нуждаться в информации об индексе. Если вы только заботитесь об этом, используйте «for i in range» (len (argset)): «вместо этого. Если вам нужны оба (как в вашем случае), то вы * должны * использовать 'enumerate' !!! Обратите внимание, что 'argset.index' может возвращать неверный индекс, если есть равные элементы, потому что' перечислять' всегда возвращает правильный индекс текущих 'args'. – Bakuriu
Рефакторинг соответственно. –
Вы видели ['plumbum'] (http://plumbum.readthedocs.org/en/latest/) или [' sh'] (http://amoffat.github.io/sh/)? Это * не *, чтобы препятствовать вам, просто чтобы вы знали, что пакеты существуют. – jfs