【问题标题】:PyClips clips.BatchStar() and Clips (batch ...) do not work togetherPyClips clips.BatchStar() 和 Clips (batch ...) 不能一起工作
【发布时间】:2017-03-28 17:31:05
【问题描述】:

我有三个文件:

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

【问题讨论】:

    标签: clips pyclips


    【解决方案1】:

    当从标准输入(键盘)请求字符时,批处理命令会打开一个文件并使用其内容。当您以交互方式使用 CLIPS 时,字符请求是由 read/evaluate/print 循环(CLIPS> 命令提示符)以及代码中的任何 read 或 readline 函数调用从标准输入发出的。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2019-08-17
      • 2016-11-23
      • 2019-02-18
      • 2015-05-16
      • 2017-10-14
      • 2012-06-01
      • 2011-11-05
      • 2018-05-20
      相关资源
      最近更新 更多