首页 > 解决方案 > 使用 subprocess.Popen 的 shell 管道

问题描述

我想将包含多个管道的命令与 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'))

但是,我收到一个错误

回溯(最后一次调用):文件“./proces.py”,第 35 行,在 process2=subprocess.Popen(argsplit2, stdin=process1.PIPE, stdout=subprocess.PIPE) AttributeError: 'Popen' object has no attribute '管道'

你能帮我解决我犯的错误吗?

标签: python-3.xunixprocess

解决方案


那是因为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'))

推荐阅读