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