如何使用python子进程从标准输出?
我试图使用python的(3.8)子进程库与swipl(Prolog解释器)通信。(我正在使用MAC OSx) 有关Prolog的更多信息: 在线Prolog解释器: 我希望能够将大量事实和规则加载到知识库中。另外,我希望能够在口译员中提出多个问题,然后得到答案 我已经尝试过通信功能,但它不能满足多次发送和接收数据的要求,因为第一次呼叫后通信线路关闭 现在,当我运行这个程序时,我认为它是在写时加载的,然后当它到达stdout.read()时,它运行该行,然后停止运行。我不确定到底发生了什么,我如何才能得到通话的输出如何使用python子进程从标准输出?,python,python-3.x,prolog,subprocess,swi-prolog,Python,Python 3.x,Prolog,Subprocess,Swi Prolog,我试图使用python的(3.8)子进程库与swipl(Prolog解释器)通信。(我正在使用MAC OSx) 有关Prolog的更多信息: 在线Prolog解释器: 我希望能够将大量事实和规则加载到知识库中。另外,我希望能够在口译员中提出多个问题,然后得到答案 我已经尝试过通信功能,但它不能满足多次发送和接收数据的要求,因为第一次呼叫后通信线路关闭 现在,当我运行这个程序时,我认为它是在写时加载的,然后当它到达stdout.read()时,它运行该行,然后停止运行。我不确定到底发生了什么,我如
导入操作系统
输入信号
导入子流程
#注意:stderr=subprocess.PIPE使终端中的swipl引入消失
p=subprocess.Popen('swipl',stdin=subprocess.PIPE,stdout=subprocess.PIPE,text=True,universal\u newlines=True)
#communicate()方法返回一个元组(stdoutdata,stderrdata)。
p、 标准写入('assert(汽车(本田18000,红色))。)
p、 标准写入(‘断言(汽车(丰田,18000,白色))。)
p、 标准写入(‘断言(汽车(福特,25000,红色))。)
p、 标准写入('assert(汽车(acura,50000,白色))。)
p、 标准写入('断言(汽车(宝马,60000,红色))。)
p、 stdin.write('[user].recommendcar(年龄,汽车):-Age=<25,汽车(汽车,成本,红色),成本=<30000.)
p、 书写标准('recommendcar(20,X.))
输出=p.stdout.read()
打印(输出)
p、 杀死
试试:
p.stdin.write('assertz(汽车(本田,18000,红色))。)
p、 书写标准('assertz(汽车(丰田,18000,白色))。)
p、 书写标准('assertz(汽车(福特,25000,红色))。)
p、 书写标准('assertz(汽车(acura,50000,白色))。)
p、 书写标准('assertz(汽车(宝马,60000,红色))。)
p、 标准写入('assertz((推荐汽车(年龄,汽车):-Age=<25,汽车(汽车,成本,红色),成本=<30000))。)
p、 书写标准('recommendcar(20,X.))
您可能已经找到了这个,但以防万一:一个Python-SWI Prolog桥。谢谢Paul!我最初使用的是它,但是我在设置它时有很多错误。所以我的老师建议我用这个
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).')