Как получить вывод из stdout, используя подпроцесс python? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь использовать библиотеку подпроцесса python (3.8) для связи со swipl (интерпретатором Prolog). (Я использую MAC OSx)

Подробнее о Прологе: https://www.swi -prolog.org

Онлайн переводчик Пролога: https://swish.swi -пролог. org

Я хочу иметь возможность загружать кучу фактов и правил в базу знаний. Отдельно я хочу иметь возможность задать несколько вопросов переводчику, а затем получить ответ.

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

Прямо сейчас, когда я запускаю программу, я думаю, что она загружается при записи, а затем, когда она попадает в stdout.read (), она запускает строку и затем останавливается. Не уверен, что именно происходит и как я могу получить вывод вызовов.

import os
import signal
import subprocess

# NOTE: stderr=subprocess.PIPE makes the swipl intro in terminal go away
p = subprocess.Popen('swipl', stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, universal_newlines=True)
# The communicate() method returns a tuple (stdoutdata, stderrdata).

p.stdin.write('assert(car(honda, 18000, red)).')
p.stdin.write('assert(car(toyota, 18000, white)).')
p.stdin.write('assert(car(ford, 25000, red)).')
p.stdin.write('assert(car(acura, 50000, white)).')
p.stdin.write('assert(car(bmw, 60000, red)).')
p.stdin.write('[user]. recommendcar(Age, Car) :- Age =< 25, car(Car, Cost, red), Cost =< 30000 .')
p.stdin.write('recommendcar(20, X).')
output = p.stdout.read()
print(output)

p.kill()

1 Ответ

0 голосов
/ 07 ноября 2019

Попробуйте:

p.stdin.write('assertz(car(honda, 18000, red)).')
p.stdin.write('assertz(car(toyota, 18000, white)).')
p.stdin.write('assertz(car(ford, 25000, red)).')
p.stdin.write('assertz(car(acura, 50000, white)).')
p.stdin.write('assertz(car(bmw, 60000, red)).')
p.stdin.write('assertz((recommendcar(Age, Car) :- Age =< 25, car(Car, Cost, red), Cost =< 30000)).')
p.stdin.write('recommendcar(20, X).')
...