【发布时间】:2021-06-13 16:15:17
【问题描述】:
如果我写
ls *.txt
进入 IPython 笔记本中的单元格,然后它会正确执行。但是,如果我尝试使用 TransformerManager().transform_cell 转换单元格,则没有任何反应,并且我得到无效的 Python 语法:
>>> from IPython.core.inputtransformer2 import TransformerManager
>>> import ast
>>> TransformerManager().transform_cell('ls *.txt')
'ls *.txt\n'
>>> ast.parse('ls *.txt\n')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ignoring_gravity/miniconda3/envs/tmp/lib/python3.8/ast.py", line 47, in parse
return compile(source, filename, mode, flags,
File "<unknown>", line 1
ls *.txt
^
SyntaxError: invalid syntax
有没有办法以返回有效 Python 代码的方式转换自动魔法?没有自动魔术的等效代码将被转换如下:
>>> TransformerManager().transform_cell('!ls *.txt')
"get_ipython().system('ls *.txt')\n"
我正在寻找的是一种检测自动魔法的方法运行代码
【问题讨论】:
-
我想你需要找出谁/什么处理了
automagics。它可能是高级 REPL 的一个特殊功能,将行的开头与可用的magics进行比较。TransformerManager代码可供阅读。 -
注意
x=ls *.py也会产生语法错误,而x=!lis *.py很好。该行的开头得到特殊处理。如果ls是单元格或多行输入中的几行之一,则同样的问题。 -
题外话,但要获得等效代码,您需要使用
%而不是!。TransformerManager().transform_cell('%ls *.txt')->"get_ipython().run_line_magic('ls', '*.txt')\n"