python-3.x - 使用 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 '管道'
你能帮我解决我犯的错误吗?
解决方案
那是因为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'))
推荐阅读
- laravel - 在 laravel 的 hichart 中显示了图表的坐标页面但是数据没有显示为图表
- c# - 如何更改gridview中复选框的大小
- dart - 自飞镖时代以来,我如何获得蜱虫?
- python - 如何通过从多个内容相似的 .csv 文件中导入数据来创建数据框?
- google-cloud-platform - 谷歌云平台:配额
- javascript - 使用正则表达式匹配两个逗号之间的字符串
- python-3.x - Mesibo 应用程序:进程以退出代码 139 完成(被信号 11 中断:SIGSEGV)
- google-app-engine - 在 Google Cloud Build 中上传构建文件夹
- swiftui - SwiftUI向navigationView添加按钮将填充应用于整个视图
- firebase - Flutter - 在future函数之后从getter中获取值