Вывод интерпретатора Ruby
скажите пожалуйста, каким образом я могу перехватить вывод интерпретатора Ruby средствами Python или Qt? Т.е. сообщения об ошибках и все такое, чтобы вывести это в стандартный QTextEdit? Пробовал через subprocess и QProcess, но не получилось.
Частично получилось сделать следующим образом:
self.process = QProcess()
self.process.readyReadStandardError.connect(self.read_data)
def run(self):
self.process.start("C:\Ruby26-x64\\bin\\ruby.exe E:\\1.rb")
def read_data(self):
s = self.process.readAllStandardError()
self.text_edit.setText(str(s))
где run привязана к кнопке. Но так она ловит не все ошибки (во всяком случае, мне так показалось), если сравнивать с RubyMine.
Как вариант можно присоединиться к процессу и читать с него, но как это делать я не знаю.
Пробовал еще вариант
proc = subprocess.Popen(['cmd.exe', 'irb'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
proc.stdin.read(1)
print(proc.stdout)
Выдает в консоль PyCharm знаки вопроса (видимо что-то с кодировкой).
Нагуглил еще такой способ
a = 'ruby E:\\irb.rb'
b = os.popen(a,'r',1)
for line in b:
print(line)
после чего консоль PyCharm переходит в inspect mode и имитирует irb, правда приложение при этом виснет. По хорошему, хотелось бы, вообще, читать весь оутпут консоли.
Ответы (1 шт):
Функция компиляции скриптов:
def run_script(self):
f = open('E:/Ruby21/bin/test.rb', 'w')
f.write(self.text_edit_1.toPlainText())
f.close()
MyOut = Popen(['ruby', 'E:/Ruby21/bin/test.rb\n'], stdout=PIPE,stderr=STDOUT)
stdout, stderr = MyOut.communicate()
self.text_edit_2.setText(stdout.decode())
Функция irb пока не доделана, но уже ясно, как ее реализовать, вот функция, привязанная к некоторой кнопке и посылающая irb выражение 1+1 (естественно, послать можно, что угодно):
self.process = QProcess()
self.process.start('E:/ruby22-x64/bin/irb.bat')
self.process.readyReadStandardOutput.connect(self.read_data)
def irb(self):
self.process.write(b"1+1\n")
def read_data(self):
s = self.process.readAllStandardOutput()
self.text_edit_3.setText(str(s))