оболочки конвейеров с использованием подпроцесса. Открыть - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы использовать команду, содержащую несколько каналов с subprocess.Popen.Вот мой короткий сценарий

#!/usr/bin/env python 

import subprocess
import datetime
import shlex

todayyearnumber = str(datetime.datetime.now().strftime('%Y'))

command = 'git log --grep "' + todayyearnumber + '.*commit" --oneline'
command2 = 'cut -d " " -f4'

argsplit=shlex.split(command)
argsplit2=shlex.split(command2)

process1=subprocess.Popen(argsplit, cwd=ebb_path, stdout=subprocess.PIPE)

process2=subprocess.Popen(argsplit2, stdin=process1.PIPE, stdout=subprocess.PIPE)

print(process2.stdout.read().decode('utf-8'))

Однако я получаю сообщение об ошибке

Traceback (последний вызов был последним): Файл "./proces.py", строка 35, в process2 = подпроцесс.Popen (argsplit2, stdin = process1.PIPE, stdout = subprocess.PIPE) AttributeError: у объекта «Popen» нет атрибута «PIPE»

Не могли бы вы помочь мне, где я допустил ошибку?

1 Ответ

0 голосов
/ 23 июня 2019

Это потому, что PIPE - это константа, определенная как subprocess.PIPE.

Полная программа будет такой, как показано ниже, если я вас правильно понимаю:

#!/usr/bin/env python

import subprocess
import shlex

command = 'echo a b c'
command2 = "awk '{print $2}'"

argsplit=shlex.split(command)
argsplit2=shlex.split(command2)

ebb_path="/tmp/"
process1=subprocess.Popen(argsplit, cwd=ebb_path, stdout=subprocess.PIPE)
stdout_data, stderr_data = process1.communicate(timeout=1)

process2=subprocess.Popen(argsplit2, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout_data2, _ = process2.communicate(input=stdout_data,
                                    timeout=1)

print(stdout_data2.decode('utf-8'))
...