代码将用Python编写,以自动运行带参数的进程并解析其输出。
命令process_name
将在命令行上使用参数arg1
,arg2
运行,并在执行期间输入input1
,input2
作为输入。所以在python中,它与Popen一起运行,如代码所示:
process_object = subprocess.Popen(['process_name','arg1','arg2','input1','input2'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
此处,process_name
可以是特定操作系统(Linux,Mac,Windows)中的任何可执行命令。
在执行特定命令期间,会出现一个输入提示:
Do you want to continue(y/N):
或
Do you want to continue(Y/n):
首先提示意味着如果输入为空且按下返回键,则默认输入为N
。同样,第二个提示的默认输入是Y
。
还有另一个提示:
Hit Enter to do this action
除了返回键之外,其他任何内容都不能被进程命令接受。
在没有命令行参数的情况下手动运行命令并在执行期间使用输入
abc
def
##this is blank because return key is not printable
然后成功执行。
在Python中自动化为:
process_object = subprocess.Popen(['process_name','abc','def',''], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
然后它不会被执行。
同样的情况:
process_object = subprocess.Popen(['process_name','abc','def','\n'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
在StackOverflow上的answer中,有一个逻辑用于对键盘上的箭头键进行编码,并且在此link中有一个ANSI转义序列表。因此,返回键的ANSI代码是'\ x1B13'并使用它,代码被修改为
process_object = subprocess.Popen(['process_name','abc','def','\x1B13'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
但是,它没有用。
代码已更改为:
process_object = subprocess.Popen(['process_name','abc','def'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process_object.communicate('')
还有另一个参数stdin在执行期间为进程提供输入。输入提供给方法communication(),它接受输入''
作为返回键输入。所以这段代码成功地执行了这个过程。
但是,这种方法对于输入流如下所示的命令不起作用:
abc
def
ghi
jkl
所以,代码改为:
process_object = subprocess.Popen(['process_name','abc','def'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process_object.communicate(' ghi jkl')
它不起作用。
如果代码更改为
process_object = subprocess.Popen(['process_name','abc','def'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process_object.communicate('')
process_object.communicate('ghi')
process_object.communicate('jkl')
然后发生错误:
ValueError: I/O operation on closed file
那么,如何让它工作,以便在代码本身的Python代码中接受夹在两个非空字符串之间的返回键输入?