PyROOT 如何更改 python 解释器?

How does PyROOT change the python interpreter?

如果我在 python 中尝试 运行 .ls,毫不奇怪,我会得到 SyntaxError

>>> .ls
  File "<stdin>", line 1
    .ls
    ^
SyntaxError: invalid syntax

但是如果我导入 PyROOT,它会以某种方式使此语法合法(并且表现与在 ROOT 中一样,列出当前文件的内容;在此处的示例中我没有打开任何文件。)

>>> import ROOT
>>> .ls
>>>

类似地,.q 在我导入 ROOT 后会退出 Python 解释器,就像在普通的 ROOT 解释器中一样。

这是如何工作的?

它可以在 lib/ROOT.py

中找到

条件是如果不是 ipython 则 sys.excepthook 被重新定义:

sys.excepthook = _excepthook

其中包含如下内容:

### RINT command emulation     
------------------------------------------------------
def _excepthook( exctype, value, traceb ):
 # catch syntax errors only (they contain the full line)
   if isinstance( value, SyntaxError ) and value.text:
      cmd, arg = split( value.text[:-1] )

    # mimic ROOT/CINT commands
      if cmd == '.q':
         sys.exit( 0 )

或以下几行:

  elif cmd == '.ls':
     return sys.modules[ __name__ ].gDirectory.ls()

如果这些都不起作用,它会恢复正常处理事情。