我想在python中运行ipython脚本,即:
code='''a=1
b=a+1
b
c'''
from Ipython import executor
for l in code.split("\n"):
print(executor(l))
谁可以打印
None
None
2
NameError: name 'c' is not defined
它存在吗?我搜索了该文档,但似乎没有(很好)记录该文档。
答案 0 :(得分:1)
简而言之,根据您要执行的操作以及要包含的IPython功能的数量,您将需要做更多的事情。
您需要知道的第一件事是IPython将其代码分成块。 每个块都有自己的结果。
如果您使用积木,请使用以下建议
如果您没有IPython提供的任何功能,并且不想每个块给出任何结果,那么您可以尝试使用exec(compile(script, "exec"), {}, {})
。
如果您还想要更多,您将需要实际生成一个InteractiveShell
实例,因为%magic
和%%magic
之类的功能需要有效的InteractiveShell
。
在我的一个项目中,我具有在InteractiveShell
实例中执行代码的功能:
https://github.com/Irrational-Encoding-Wizardry/yuuno/blob/master/yuuno_ipython/ipython/utils.py#L28
如果只想获取每个表达式的结果,
然后,您应该使用ast
-Module解析代码并添加代码以返回每个结果。
您将从上方的第34行起的链接中看到此功能。
以下是相关内容:
if isinstance(expr_ast.body[-1], ast.Expr):
last_expr = expr_ast.body[-1]
assign = ast.Assign( # _yuuno_exec_last_ = <LAST_EXPR>
targets=[ast.Name(
id=RESULT_VAR,
ctx=ast.Store()
)],
value=last_expr.value
)
expr_ast.body[-1] = assign
else:
assign = ast.Assign( # _yuuno_exec_last_ = None
targets=[ast.Name(
id=RESULT_VAR,
ctx=ast.Store(),
)],
value=ast.NameConstant(
value=None
)
)
expr_ast.body.append(assign)
ast.fix_missing_locations(expr_ast)
取而代之的是对正文中的每个语句(而不是最后一个语句)执行此操作,并将其替换为某些“ printResult”转换将为您做同样的事情。