You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PySWIP实现Python调用Prolog时,如何将Prolog的writeln输出至Python终端?

在PySWIP中让Prolog的writeln输出到Python终端

嘿,我懂这个困扰——默认情况下PySWIP不会把SWI-Prolog的输出直接同步到Python的终端,不过只需要简单几步就能搞定这个问题。

问题根源

SWI-Prolog在PySWIP的封装下有自己独立的I/O流体系,它的writeln默认输出到Prolog自己的标准输出,而不是Python进程的终端输出,所以你看不到这些内容。我们需要手动把Prolog的输出流和Python的sys.stdout绑定起来。

解决方案

只需要导入sys模块,然后在初始化Prolog实例后,通过Prolog的set_prolog_flag/2谓词将输出重定向到Python的标准输出流即可。下面是修改后的完整代码:

import sys
from pyswip import Prolog

p = Prolog()
# 关键步骤:将Prolog的输出流绑定到Python的stdout
p.query('set_prolog_flag(output, %s)' % id(sys.stdout))

p.retractall('rule1(_,_)')
p.retractall('rule2(_,_)')
p.retractall('rule3(_,_)')
p.assertz('rule2(X):- writeln(\'in rule2\': X)')
p.assertz('rule1(X,Y):- rule2(X), writeln(\'rule2 exectued\'),rule3(Y)')
p.assertz('rule3(Y):- writeln(\'in rule3\': Y)')

print(list(p.query('rule1(1,2)')))

运行效果

执行这段代码后,你会在Python终端看到Prolog中writeln的输出,顺序如下:

in rule2: 1
rule2 exectued
in rule3: 2
[{}]

额外小技巧

如果你想把Prolog的输出捕获到变量里而不是直接打印到终端,可以用io.StringIO代替sys.stdout,比如:

from io import StringIO
output_buffer = StringIO()
p.query('set_prolog_flag(output, %s)' % id(output_buffer))
# 执行查询...
captured_output = output_buffer.getvalue()
print("捕获的Prolog输出:", captured_output)

内容的提问来源于stack exchange,提问作者Shubham Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:32:53