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()
如果这些都不起作用,它会恢复正常处理事情。
如果我在 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()
如果这些都不起作用,它会恢复正常处理事情。