Как запустить скрипт ipython в python? - PullRequest
0 голосов
/ 15 октября 2018

Я бы хотел запустить скрипт ipython на python, то есть:

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 голосов
/ 15 октября 2018

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

...