工作中使用Python调用Shell来执行一些命令,在执行命令时,可能会需要用户进行输入,例如需要输入y确认之后才能删除,如何使用自动化来实现而不需要人工参与呢?此问题的来源如下:
公司的Bug管理系统可以使用客户端来创建查询、导出查询结果到Excel(比如项目的Bug列表),但客户端是手工操作的,客户端自带的im.exe命令可以创建查询、执行已有查询并导出结果到Excel,调用Shell来执行im.exe命令可比客户端界面的操作快多了。
任务:
导出本研发中心项目上周内解决或关闭的所有Bug,并生成报表
思路:
- 使用im.exe创建查询,查询包含了具体的搜索条件,例如项目名,查询的字段名,Bug解决或关闭的时间段等
- 使用im.exe来导出该查询结果,默认导出到Excel,然后使用Python处理查询结果,生成报表
- 使用im.exe删除该查询(因为报表需要每周刷新,所以查询用一次就不再用了,为避免生成的查询越来越多,最好是删除掉无用的查询)
下面测试创建查询和删除查询的命令执行过程:
问题:
使用自动化实现,创建查询只有一条命令,执行查询也是一条语句,subprocess.Popen(im命令)即可解决:但删除该查询时,会等待用户输入y确认之后才会真正执行删除的,这里怎么实现自动化输入y,无需人工输入呢?
解决思路:
尝试使用subprocess.Popen执行4条命令:创建查询、执行查询、删除查询、输入y并回车,发现输入y并回车根本就不能被识别为一个命令,而且subprocess.Popen每次启动一个进程,输入y并回车也不是在第3个命令对应的进程里。
网上搜索了一番,说使用&&可以把两个命令连接到一起,但亲测发现删除失败,主要是因为两个命令是连续的,没有时间缓冲,因为执行删除时,提交命令后会等待系统反馈,然后才会显示要确认删除,并等待用户输入,虽然时间很短,但这样操作就是不成功。查了下Subprocess.Popen的相关说明,发现在执行命令的过程中还可以使用communicate命令对进程进行输入,于是问题得到了解决。
下面是测试代码(已忽略查询的具体条件,执行查询以及处理报告的操作)。
import subprocess
query = "'_Test_Query'"
p1 = subprocess.Popen('im createquery --name=' + query, shell=True)
p1.wait()
print('Done')
sleep(3)
p1 = subprocess.Popen('im deletequery ' + query, shell=True, stdout=subprocess.PIPE,stdin=subprocess.PIPE)
sleep(1)
p1.communicate('y\n') #关键步骤,输入y并回车
执行结果:
欢迎来到testingpai.com!
注册 关于