python - 如何顺序处理多个标准输入到python?
问题描述
我有一个定期打印到标准输出的进程(以秒为单位),我想通过标准输入将该进程的输出通过管道传输到 python 程序来处理它。我面临的问题是,在继续之前,我还想听取用户关于如何处理它的意见。作为一个玩具例子,
interval.sh
定期打印到标准输出的程序 ( )。:
#!/bin/bash
for i in {1..10}
do
echo $i
sleep 1s
done
Python 程序 ( test.py
) 处理输入:
#!/usr/bin/env python3
import sys
for line in sys.stdin:
while True:
validate = input("Do you want to accept task {}? [y/n]\n".format(line))
if validate == 'y':
print("User accepted the input\n")
break
elif validate == 'n':
print("User rejected the input\n")
break
else:
print("Please enter a valid input")
我目前运行的程序如下:
$ ./interval.sh | ./test.py
Do you want to accept task 1
? [y/n]
Input not supported
Do you want to accept task 1
? [y/n]
Input not supported
Do you want to accept task 1
? [y/n]
可以看到,上面的程序认为来自shellcode的输入就是用户的输入。我想做的是:
$./interval.sh | ./test.py
Do you want to accept task 1? [y/n] y
The User accepted the input
Do you want to accept task 2? [y/n] y // Move to task 2 only when the user provides a valid input
The User accepted the input
Do you want to accept task 3? [y/n]
我看到了这个问题,因为来自程序和用户的输入来自标准输入,因此难以区分。此外,interval.sh
在我的实际场景中无法修改。我还能如何解决这个问题?
解决方案
这很可能与您使用管道的方式有关。command_1 | command_2
. command_1的输出充当 command_2 的输入,这就是您的程序失败的原因。
一个很好的选择是用python编写整个。
您可以尝试的另一件事是
for i in {1..10}
do
echo $i
sleep 1s
./test.py $i
done
通过对 bash 脚本的此更改,您不再需要使用管道方法。简单地运行 bash 脚本会导致 python 程序每次都运行,因此 bash 代码被执行,它也可以解决输入问题。
import sys
line = sys.stdIn
while True:
validate = input("Do you want to accept task {}? [y/n]\n".format(line))
if validate == 'y':
print("User accepted the input\n")
break
elif validate == 'n':
print("User rejected the input\n")
break
else:
print("Please enter a valid input")
现在您可以运行 bash 脚本
./interval.sh
推荐阅读
- plotly - 如何在 Plotly 中自动化甘特图
- ios - 使用 QR 在 iOS 上保存联系人
- javascript - 从头开始创建的自定义 JavaScript Promise 中的“然后”在 Promise 解析之前执行。是什么原因?
- firebase - Flutter & firestore:如何使用自动生成 id 引用集合
- sql - SQLSTATE [23000]:违反完整性约束:1048 列 'status_member' 不能为空
- r - 使用唯一向量的输入在 R 中不起作用
- javascript - 排序的响应变成未排序的 om 前端 jquery laravel
- python - 如何让 Python 3.9 运行命令提示符 windows 10?
- sql - 我需要使用链接表加入
- python - 如何在嵌套列表中找到一个子集,它在python中元素的总和最高?