如何在python中运行ipython脚本?

时间:2018-10-15 14:05:18

标签: python ipython

我想在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

它存在吗?我搜索了该文档,但似乎没有(很好)记录该文档。

1 个答案:

答案 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”转换将为您做同样的事情。