PyClips clips.BatchStar() и Clips (пакетные...) не работают вместе

У меня есть три файла:

1.) Файл Pythontest.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] Сообщения. Что здесь происходит?

РЕДАКТИРОВАТЬ:

Я узнал о зажимах batch*(...) команда. И используя это вместо batch(...) работает как положено. Это почему?

1 ответ

Решение

Пакетная команда открывает файл и использует его содержимое при запросах символов из стандартного ввода (клавиатура). Когда вы используете CLIPS в интерактивном режиме, символьные запросы поступают из стандартного ввода с помощью цикла чтения / оценки / печати (командная строка CLIPS>), а также любых вызовов функций чтения или чтения строки в вашем коде.

Когда вы встраиваете CLIPS, как в этом примере PyCLIPS, цикл чтения / оценки / печати отсутствует, поэтому единственные запросы символов из стандартного ввода будут поступать из функций read и readline. Поскольку этот пример не выполняет никаких символьных запросов из стандартного ввода, содержимое пакетного файла никогда не обрабатывается.

Команда batch* открывает файл, непосредственно анализирует его содержимое для команд, а затем сразу же выполняет их - для выполнения команд не требуется делать запросы на символы из стандартного ввода.

Пакетная команда полезна для запуска тестовых случаев из командной строки, потому что вы можете имитировать весь ввод с клавиатуры. Команда batch* полезна для запуска командных сценариев, когда у вас нет немедленного доступа к командной строке (либо потому, что вы встраиваете CLIPS, либо CLIPS выполняется в данный момент), либо вы не хотите, чтобы исполняемые команды и их возвращаемые значения отображались на стандартный вывод.

Сообщение об ошибке ENVRNMNT8 появляется при выходе из CLIPS и определяет, что вся выделенная память не была должным образом освобождена. В этом случае в коде освобождения есть ошибка для необработанного пакетного файла, которая не освобождает строку, содержащую имя пакетного файла (для CLIPS 6.30). Исправление было проверено в репозитории CLIPS SVN на SourceForge.

Другие вопросы по тегам