CLIPS Python3 CLIPSError

时间:2019-01-12 01:32:28

标签: python-3.x clips clipspy

我在使用CLIPSpy代码时遇到了一些问题。我已将问题缩小为CLIPS_CONSTRUCTS.encode()或environment.load(constructs_file.name)的编码方法。我试图捕获的目标是在机油温度高于32且机油压力高于0时触发一条规则。我已经附加了正在使用的SampleData.csv。这是我论文研究的一部分,我想归功于所有对我有帮助的东西!

  • 操作系统和版本:Windows 10 64位
  • Python版本:3.7.2
  • 库和版本(通过点列表)
    cffi 1.11.5
    clipspy 0.3.0
    点18.1
    pycparser 2.19
    setuptools 40.6.2

Error Received

import sys
from tempfile import NamedTemporaryFile

import clips


CLIPS_CONSTRUCTS = """
(deftemplate oil-measure
  (slot utc-time (type STRING))
  (slot temperature (type INTEGER))
  (slot pressure (type INTEGER)))

(defrule oil-is-hot
  (oil-measure (temperature ?temp) (utc-time ?time))
  (test (> ?temp 32))
  =>
  (printout t ?time tab "temperature:" tab ?temp crlf))

(defrule pressure-is-high
  (oil-measure (pressure ?press&:(> ?press 0)) (utc-time ?time))
  =>
  (printout t ?time tab "pressure:" tab ?press crlf))
"""


def main():
    environment = clips.Environment()

    # use environment.load() to load constructs from a file
    with NamedTemporaryFile() as constructs_file:
        constructs_file.write(CLIPS_CONSTRUCTS.encode())
        constructs_file.flush()

        environment.load(constructs_file.name)

    # enable fact duplication as data has duplicates
    environment.eval("(set-fact-duplication TRUE)")

    # Template facts can be built from their deftemplate
    oil_measure_template = environment.find_template("oil-measure")

    for time, temp, press in get_data_frames(sys.argv[1]):
        new_fact = oil_measure_template.new_fact()

        # Template facts are represented as dictionaries
        new_fact["utc-time"] = time
        new_fact["temperature"] = int(temp)
        new_fact["pressure"] = int(press)

        # Add the fact into the environment Knowledge Base
        new_fact.assertit()

    # Fire all the rules which got activated
    environment.run()


def get_data_frames(file_path):
    """Parse a CSV file returning the dataframes."""
    with open(file_path) as data_file:
        return [l.strip().split(",") for i, l in enumerate(data_file) if i > 1]


if __name__ == "__main__":
    main()

SampleData.csv

2 个答案:

答案 0 :(得分:1)

这是Windows here文档中对NamedTemporaryFile的限制。

您可以使用mkstemp或完成后删除的常规文件来解决该问题。

constructs_file, constructs_file_name = mkstemp()
constructs_file.write(CLIPS_CONSTRUCTS.encode())
constructs_file.close()

environment.load(constructs_file_name)
os.remove(constructs_file_name)

答案 1 :(得分:0)

使用以下代码使其正常工作:

constructs_file, constructs_file_name = mkstemp()
file = open(constructs_file, 'wb')
file.write(CLIPS_CONSTRUCTS.encode())
file.close()

environment.load(constructs_file_name)
os.remove(constructs_file_name)

由于某种原因,代码没有文件写入方法,因此文件描述符出现问题。修改代码有点麻烦!可行!