1

我有 pyroot 的问题。当我尝试导入 ROOT 直方图时,我总是得到相同的 AttributeError。

>>> from ROOT import TH1F
AttributeError: type object 'TArray' has no attribute '__getitem__'

During handling of the above exception, another exception occurred:

SystemError: <built-in method mro of ROOT.PyRootType object at 0x328fb18> returned a result with an error set
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'TH1F'

我还尝试了 rootpy ,但它不起作用。大概有关系?

我安装了 Python 3.5,并使用 gcc 5.2.0 进行了 ROOT 的全新安装。Python 模块在我运行时列出root-config --features

有任何想法吗?还是解决方案?

4

1 回答 1

4

您面临的问题与 Python 最近的更改有关,该更改解决了错误的异常处理。包装器中的调用Pythonize.cxx尝试将__getitem__属性重命名为TArray不存在的类。这会导致 AttributeError 在 Python 中被忽略,直到新的 python3.5 版本发布。

要恢复旧行为,您需要修改目录Utility.cxx中的文件$ROOTSYS/bindings/pyroot/src/。搜索方法

Bool_t PyROOT::Utility::AddToClass( PyObject* pyclass, const char* label, const char* func )

它应该在第 230 行左右。在这个方法中是一个 if 条件:

if ( ! pyfunc )
    return kFALSE;

在这里,您需要将上面的代码替换为以下几行:

if ( ! pyfunc ) {
   PyErr_Clear();
   return kFALSE;
}

的调用PyErr_Clear()将解决此问题。保存文件并重新编译您的 ROOT 安装。这应该可以解决问题。

编辑:已经有一个关于这个问题的错误报告:https ://sft.its.cern.ch/jira/browse/ROOT-7640

于 2015-10-27T08:41:32.717 回答