Как захватить стандартный ввод консольного приложения, написанного на C #, который содержит Console.ReadKey (), через скрипт python с использованием subprocess.Popen () - PullRequest
1 голос
/ 20 сентября 2019

У меня есть консольное приложение, написанное на 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)

MyСценарий выглядит следующим образом

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.

1 Ответ

0 голосов
/ 27 сентября 2019

Я нашел хак для этой проблемы.Моей главной целью было передать ввод в консольное приложение с помощью программы.Так как я не могу захватить 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)
...