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.