我有三个文件:
1。)python文件test.py
:
import clips
PATH_TO_CLP_FILE = r'd:\temp\batch_bug.clp'
clips.BatchStar(PATH_TO_CLP_FILE)
clips.PrintFacts()
2。)文件batch_bug.clp
:
(assert (asdf0))
(batch "D:\\temp\\batchbug2.clp")
(assert (asdf1))
(printout t (facts))
最后是文件batchbug2.clp
:
(assert (fdsa))
运行python test.py
会产生以下输出:
f-0 (initial-fact)
f-1 (asdf0)
f-2 (asdf1)
For a total of 3 facts.
[ENVRNMNT8] Environment data not fully deallocated.
[ENVRNMNT8] MemoryAmount = 22.
[ENVRNMNT8] MemoryCalls = 1.
这不是我的预期,因为没有(fdsa)
事实,即调用(batch "D:\\temp\\batchbug2.clp")
不起作用。此外,还有[ENVRNMNT8]
条消息。这是怎么回事?
修改
我发现了CLIPS batch*(...)
命令。并使用此代替batch(...)
按预期工作。那是为什么?
答案 0 :(得分:1)
批处理命令打开一个文件,并在请求标准输入(键盘)中的字符时使用其内容。当您以交互方式使用CLIPS时,字符请求由读取/评估/打印循环(CLIPS>命令提示符)的标准输入以及代码中的任何读取或读取函数调用生成。
当您在此PyCLIPS示例中嵌入CLIPS时,没有读取/评估/打印循环,因此标准输入中对字符的唯一请求将来自read和readline函数。由于此示例不会从标准输入发出任何字符请求,因此永远不会处理批处理文件的内容。
batch *命令打开一个文件,直接解析其内容以获取命令,然后立即执行它们 - 不需要为标准输入请求执行命令。
批处理命令对于从命令提示符运行测试用例非常有用,因为您可以模拟所有键盘输入。当您无法立即访问命令提示符(因为您正在嵌入CLIPS或CLIPS当前正在执行)或者您不希望执行的命令及其返回值回显时,batch *命令对于运行命令脚本非常有用到标准输出。
CLIPS退出时发生ENVRNMNT8错误消息,它确定未正确释放所有已分配的内存。在这种情况下,未处理的批处理文件的释放代码中存在一个错误,该错误不会释放包含批处理文件名的字符串(对于CLIPS 6.30)。已在SourceForge的CLIPS SVN存储库中检查了修复程序。