0

当我尝试使用 Python 的 PySD 包读取 Vensim 模型文件 (.mdl) 时收到以下错误消息。

我的代码是:

import pysd
import os

os.chdir('path/to/model_file')

model = pysd.read_vensim('my_model.mdl')

我收到的错误是:

Traceback (most recent call last):
  Python Shell, prompt 13, line 1
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pysd/pysd.py", line 53, in read_vensim
    py_model_file = translate_vensim(mdl_file)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pysd/vensim2py.py", line 673, in translate_vensim
    entry.update(get_equation_components(entry['eqn']))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pysd/vensim2py.py", line 251, in get_equation_components
    tree = parser.parse(equation_str)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/parsimonious/grammar.py", line 123, in parse
    return self.default_rule.parse(text, pos=pos)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/parsimonious/expressions.py", line 110, in parse
    node = self.match(text, pos=pos)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/parsimonious/expressions.py", line 127, in match
    raise error
parsimonious.exceptions.ParseError: Rule 'subscriptlist' didn't match at '' (line 1, column 21).

我已经搜索了这个特定的错误,但我找不到很多关于“下标列表”匹配规则失败的信息。

我很欣赏任何见解。谢谢你。

4

2 回答 2

0

如果您没有使用下标,您可能在解析器中发现了一个错误。如果是这样,最好的做法是在项目的 github问题跟踪器中创建报告。您发布的堆栈跟踪表明错误发生在文件的第一行,并且错误与等式右侧的解析方式有关。您可能会在错误报告中包含前几行,以帮助我重新创建问题。我将在我们不断增长的测试套件中添加一个案例,然后我们可以确保它不会成为问题。

于 2016-10-19T14:43:24.347 回答
0

好消息是您的代码没有任何问题。=) (虽然您也可以在.read_vensim调用中包含文件的路径,如果您不想更改目录)。

在这种情况下,有几种可能性会导致此问题。一种是如果模型文件是使用足够旧版本的 Vensim 创建的,则语法可能与当前解析器的设计不同。解决此问题的一种方法是更新 Vensim 并在那里重新加载模型文件 - Vensim 将更新为当前语法。

如果您已经在使用最新版本的 Vensim(解析器是使用 Vensim 6.3E 的语法开发的),那么解析错误可能是由于尚未包含的功能造成的。下标仍有一些突出的问题,您可以在此处此处阅读)。

于 2016-10-18T18:28:44.650 回答