我在使用CLIPSpy代码时遇到了一些问题。我已将问题缩小为CLIPS_CONSTRUCTS.encode()或environment.load(constructs_file.name)的编码方法。我试图捕获的目标是在机油温度高于32且机油压力高于0时触发一条规则。我已经附加了正在使用的SampleData.csv。这是我论文研究的一部分,我想归功于所有对我有帮助的东西!
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()
答案 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)
由于某种原因,代码没有文件写入方法,因此文件描述符出现问题。修改代码有点麻烦!可行!