首页 > 解决方案 > 如何顺序处理多个标准输入到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在我的实际场景中无法修改。我还能如何解决这个问题?

标签: python

解决方案


这很可能与您使用管道的方式有关。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

推荐阅读