Интерактивное общение с запущенным процессом - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь автоматизировать набор тестов, встроенный в среду Ruby.Мне нужно взаимодействовать с этим набором тестов с использованием Python, чтобы мы захватили выходные данные Ruby и отправили необходимые данные из сценария Python.При этом используется ruby.exe (оболочка), на которой выводится вывод и читается с клавиатуры.В основном стандартная концепция.Я не собираюсь менять фреймворк ruby, но мне нужно автоматизировать, используя только скрипт на python.

Я изначально начал с концепции Popen Pipe в python.я смог получить вывод из процесса ruby ​​с помощью API pipe.communicate ().Но это работает только один раз.Если я сделаю pipe.communicate (), это не удастся.Я узнал о модуле pexpect в Python, но он используется для ОС Unix, а не для Windows, но в тестовом наборе используются Windows API.Тогда я, хотя из Threading, fifo ничего не работал.Я получил код для эмулятора KeyBoard, чтобы скрипт работал как клавиатура, но он печатал на своей оболочке и не использовал другой процесс.Я даже пытался получить PID процесса, а затем связаться с ним, используя его идентификатор, но даже там мне не удалось.Так что с нетерпением ждем любой новой идеи для этой автоматизации.

# Python Script to Call Ruby
import os
import signal
import subprocess
import sys
from threading import Thread
from subprocess import Popen, PIPE, STDOUT

slave_process = None
var = None
read = False
command = "ruby"

def slaveRead(): # Function read the output form the Child Process.
        global out, errout, var
        out = slave_process.comminicate()
        #out = slave_process.stdout.read() try
        #out = slave_process.read() try
        #slave_process.stdin.write() try
        var = out.decode('utf-8')
        print(var)

def runCommand(): # Function to create the Child Process  
    global slave_process
    slave_process = subprocess.Popen(['ruby', 'C:/_ddm/TEST_SUITE/test_exec/XXX.rb'], shell=True, stdin = PIPE , stdout=PIPE,stderr=STDOUT);

rootpath="C:/_ddm/TEST_SUITE"
os.environ['TEST_SUITE_DIR'] = rootpath
os.environ['RUBYLIB'] = rootpath
filepath="C:/_ddm/TEST_SUITE/XXX.bat"

print('launching slave process...')

runCommand()
slaveRead()
slaveRead()
slaveRead()
slaveRead()

Я могу запустить процесс и общаться с ним только после того, как мне понадобится повторяющийся сеанс.

...