Короче говоря, в зависимости от того, что вы хотите сделать и сколько функций 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
и добавить код для возврата каждого результата.Вы увидите это в функции, связанной выше со строки 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» -трансформацией сделает то же самое для вас.