已解决:Python 调用 Shell 执行系统命令,等待用户输入时如何自动输入内容并确认

本贴最后更新于 1365 天前,其中的信息可能已经时移世异

工作中使用Python调用Shell来执行一些命令,在执行命令时,可能会需要用户进行输入,例如需要输入y确认之后才能删除,如何使用自动化来实现而不需要人工参与呢?此问题的来源如下:

公司的Bug管理系统可以使用客户端来创建查询、导出查询结果到Excel(比如项目的Bug列表),但客户端是手工操作的,客户端自带的im.exe命令可以创建查询、执行已有查询并导出结果到Excel,调用Shell来执行im.exe命令可比客户端界面的操作快多了。

任务:
导出本研发中心项目上周内解决或关闭的所有Bug,并生成报表

思路:

  1. 使用im.exe创建查询,查询包含了具体的搜索条件,例如项目名,查询的字段名,Bug解决或关闭的时间段等
  2. 使用im.exe来导出该查询结果,默认导出到Excel,然后使用Python处理查询结果,生成报表
  3. 使用im.exe删除该查询(因为报表需要每周刷新,所以查询用一次就不再用了,为避免生成的查询越来越多,最好是删除掉无用的查询)

下面测试创建查询和删除查询的命令执行过程:

image.png

问题:
使用自动化实现,创建查询只有一条命令,执行查询也是一条语句,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并回车

执行结果:

image.png

回帖
请输入回帖内容 ...