基于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
相关产品推荐
相关产品推荐

