我有一个用C#编写的控制台应用程序。我正在尝试使用python脚本自动执行它。控制台应用程序使用Console.ReadKey()
而不是Console.ReadLine()
或Console.Read()
。尝试使用python subprocess.Popen()
根据Microsoft文档
“ In属性是从控制台以外的其他流重定向的。”
如果捕获应用程序的
stdin
,它将检测到stdin
已从控制台输入流重定向,并引发无效操作异常。
Unhandled Exception: System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected from a file. Try Console.Read. at System.Console.ReadKey(Boolean intercept)
我的脚本如下)>
import subprocess from subprocess import run,call,PIPE,Popen import time with Popen(['ConsoleProgram.exe'],stdout=PIPE,stdin=PIPE,encoding ='UTF-8') as process: print('Writing the command') time.sleep(5) out,err = process.communicate('help') if(err != None): print('Command execution failed') else: print(out)
我正在尝试找到解决此问题的方法。我认为这是有可能的,因为很多控制台应用程序都可以通过python脚本实现自动化。
我有一个用C#编写的控制台应用程序。我正在尝试使用python脚本自动执行它。控制台应用程序使用Console.ReadKey()而不是Console.ReadLine()或Console ....
我发现此问题的原因。我的主要目的是使用程序将输入传递到控制台应用程序。由于我无法捕获stdin
并通过输入,因此我想到模仿按键。我为此使用了“ pyautogui”。
import subprocess
from subprocess import run,call,PIPE,Popen
import time
from pyautogui import press
with Popen(["CommandProgram.exe"],stdout=PIPE,encoding = 'UTF-8') as process:
print('Writing the command')
time.sleep(2)
#out,err = process.communicate('help')
out = process.stdout.readline()
process.stdout.flush()
press('h')
press('e')
press('l')
press('p')
press('enter')
for line in process.stdout :
print(line)
process.stdout.flush()
press('r')
press('u')
press('n')
press('enter')
for line in process.stdout :
print(line)