从python脚本向shell提供输入
首先,我对编程非常陌生,尤其是Python,我已经学习了大约1.5周,所以欢迎任何详细的批评和/或解释性的更正 我们正在我的公司生产一个特定的设备,它正在QA站使用开发人员提供的shell脚本进行测试。我不允许更改上述脚本 在测试的某一点上,需要对两幅图像进行比较,将图像显示给站点操作员,并要求操作员以y/n格式输入 我正在尝试设计一个python脚本,它能够根据我从图像比较中得到的分数自动提供这个输入从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
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一次读取几个字符,并与您期望的内容进行比较
您可能希望将该模块作为一个更简单的替代方案进行研究