PyClips clips.BatchStar()和Clips(批处理...)不能一起工作

时间:2017-03-28 17:31:06

标签: clips pyclips

我有三个文件:

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(...)按预期工作。那是为什么?

1 个答案:

答案 0 :(得分:1)

批处理命令打开一个文件,并在请求标准输入(键盘)中的字符时使用其内容。当您以交互方式使用CLIPS时,字符请求由读取/评估/打印循环(CLIPS>命令提示符)的标准输入以及代码中的任何读取或读取函数调用生成。

当您在此PyCLIPS示例中嵌入CLIPS时,没有读取/评估/打印循环,因此标准输入中对字符的唯一请求将来自read和readline函数。由于此示例不会从标准输入发出任何字符请求,因此永远不会处理批处理文件的内容。

batch *命令打开一个文件,直接解析其内容以获取命令,然后立即执行它们 - 不需要为标准输入请求执行命令。

批处理命令对于从命令提示符运行测试用例非常有用,因为您可以模拟所有键盘输入。当您无法立即访问命令提示符(因为您正在嵌入CLIPS或CLIPS当前正在执行)或者您不希望执行的命令及其返回值回显时,batch *命令对于运行命令脚本非常有用到标准输出。

CLIPS退出时发生ENVRNMNT8错误消息,它确定未正确释放所有已分配的内存。在这种情况下,未处理的批处理文件的释放代码中存在一个错误,该错误不会释放包含批处理文件名的字符串(对于CLIPS 6.30)。已在SourceForge的CLIPS SVN存储库中检查了修复程序。