Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python脚本向shell提供输入_Python_Python 3.x_Shell - Fatal编程技术网

从python脚本向shell提供输入

从python脚本向shell提供输入,python,python-3.x,shell,Python,Python 3.x,Shell,首先,我对编程非常陌生,尤其是Python,我已经学习了大约1.5周,所以欢迎任何详细的批评和/或解释性的更正 我们正在我的公司生产一个特定的设备,它正在QA站使用开发人员提供的shell脚本进行测试。我不允许更改上述脚本 在测试的某一点上,需要对两幅图像进行比较,将图像显示给站点操作员,并要求操作员以y/n格式输入 我正在尝试设计一个python脚本,它能够根据我从图像比较中得到的分数自动提供这个输入 from skimage.measure import compare_ssim as ss

首先,我对编程非常陌生,尤其是Python,我已经学习了大约1.5周,所以欢迎任何详细的批评和/或解释性的更正

我们正在我的公司生产一个特定的设备,它正在QA站使用开发人员提供的shell脚本进行测试。我不允许更改上述脚本

在测试的某一点上,需要对两幅图像进行比较,将图像显示给站点操作员,并要求操作员以y/n格式输入

我正在尝试设计一个python脚本,它能够根据我从图像比较中得到的分数自动提供这个输入

from skimage.measure import compare_ssim as ssim
import cv2 as cv2

class Compare_images:

    def __init__(self):
        self.s = None
        self.original = cv2.imread("img1.png")
        self.contrast = cv2.imread("img2.png")

    def compare_images(self):
        self.s = ssim(self.original, self.contrast, multichannel = True)
        return self.s
我有两个问题,第一个问题是,我似乎无法捕捉脚本读取输入的时刻,只有前后的回声。 其次,我似乎找不到一种方法来提供输入并让脚本继续执行它的任务

现在进入技术细节:我使用这个模块来处理图像比较

from skimage.measure import compare_ssim as ssim
import cv2 as cv2

class Compare_images:

    def __init__(self):
        self.s = None
        self.original = cv2.imread("img1.png")
        self.contrast = cv2.imread("img2.png")

    def compare_images(self):
        self.s = ssim(self.original, self.contrast, multichannel = True)
        return self.s
这是shell脚本的示例

echo "Welcome!"

#something happens here

read -p "Script is asking for user input as in y/n:" userinput

if [ "$userinput" = "n" ]
then 
    #script continues 1 way
else 
    #script continues another way
fi
这是我的主要剧本

from subprocess import Popen, PIPE
from compare_images import Compare_images
reply = None

def run(command):
    process = Popen(command, stdout=PIPE, shell=True)
    while True:
        line = process.stdout.readline().rstrip()
        if not line:
            break
        yield line


if __name__ == "__main__":
    for path in run("./shellscript.sh"):
        if 'Script is asking for user input as in y/n:' in path.decode():
            a = Compare_images()
            a.compare_images()
            result = a.s
            if result<0.9:
                reply = "n"
                #input to shell script is given
                print(f'comparison result is {result}')

            else:
                reply = "y"
                #input to shell script is given
                print(f'comparison result is {result}')

我使用的是Python3.6,运行的是Ubuntu18.04。提前感谢您的帮助

为了向外部进程发送数据,您需要向Popen调用添加一个stdin=PIPE参数。然后使用write和flush将数据发送到进程flush是必需的,因为流是缓冲的

process.stdin.write('yes\n')
process.stdin.flush()
还将text=True传递给Popen调用,让Python为您处理二进制/文本解码。那你就不需要自己去解码了

这里更困难的部分是read-p提示符变量不会在提示符后打印换行符。因此,您的readline一直在等待一个完整的行。您可能需要使用read here一次读取几个字符,并与您期望的内容进行比较

您可能希望将该模块作为一个更简单的替代方案进行研究