如何通过使用subprocess.Popen()的python脚本捕获用C#编写的控制台应用程序的stdin,其中包含console.ReadKey()
我有一个用C#编写的控制台应用程序。我正在尝试使用python脚本自动化它的执行。console应用程序使用如何通过使用subprocess.Popen()的python脚本捕获用C#编写的控制台应用程序的stdin,其中包含console.ReadKey(),c#,python,automation,subprocess,console.readkey,C#,Python,Automation,Subprocess,Console.readkey,我有一个用C#编写的控制台应用程序。我正在尝试使用python脚本自动化它的执行。console应用程序使用console.ReadKey()而不是console.ReadLine()或console.Read()。尝试使用pythonsubprocess.Popen() 根据微软的文档 “In属性从控制台以外的流重定向。” 如果我捕获应用程序的stdin,它将检测到stdin已从控制台输入流重定向,并引发无效操作异常 Unhandled Exception: System.InvalidOpe
console.ReadKey()
而不是console.ReadLine()
或console.Read()
。尝试使用pythonsubprocess.Popen()
根据微软的文档
“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脚本中实现了自动化 我找到了解决这个问题的方法。我的主要目的是使用程序将输入传递到控制台应用程序。由于我无法捕获
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)
我找到了解决这个问题的方法。我的主要目的是使用程序将输入传递到控制台应用程序。由于我无法捕获
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)