如何使用subprocess.Popen()通过python脚本捕获用C#编写的包含Console.ReadKey()的控制台应用程序的stdin,>

问题描述 投票:1回答:1

我有一个用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 ....

c# python automation subprocess console.readkey
1个回答
0
投票

我发现此问题的原因。我的主要目的是使用程序将输入传递到控制台应用程序。由于我无法捕获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)
© www.soinside.com 2019 - 2024. All rights reserved.