如何让IPython的magic在导入的函数中使用调用方的名称空间?

2024-04-19 17:16:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图调用在'时间x.py'从中调用'caller.py,然后应该通过“%run”从(PyCharm的)IPython控制台调用它caller.py".

这当前会导致“NameError:name‘pickle’is not defined”。

# timex.py

from IPython import get_ipython

def time_expression(exp: str):    
    print(f"time expression: {exp}", flush=True)
    return get_ipython().magic(f"timeit {exp}")

^{pr2}$
# Then run from IPython-console:

>>>%run caller.py
time expression: pickle.dumps(packet, protocol=-1)
NameError: name 'pickle' is not defined

显然ipython timeit魔法的名称空间不包含 caller.py-全球性的。将globals()作为time_表达式的参数传递和从within time_表达式更新全局参数没有帮助,而将get_ipython()作为参数传递也没有起到作用。

有没有办法让它发挥作用?

如果我在caller.py中定义时间表达式并用“ipython”从终端调用它,它就可以工作了caller.py“,但我更愿意把它放在库中,然后直接导入需要的地方。

(Python 3.6.3、IPython 6.2.1)


Tags: runnamepygettimeis表达式ipython
1条回答
网友
1楼 · 发布于 2024-04-19 17:16:27

好吧,看来我运气不错。 我在这里发现了一个提示link,即shell有一个“user”参数。 然后用调用者的局部变量更新此用户词典是使其在从中导入时工作的解决方案caller.py通过运行%运行caller.py从IPython控制台。在

有点老土,我现在觉得脏兮兮的;) 也许还有更优雅的方式?在

import sys
from IPython import get_ipython

def time_expression(exp: str):
    """"""
    ipy = get_ipython()
    ipy.__dict__['user_ns'].update(sys._getframe(1).f_locals)
    print(f"time expression: {exp}", flush=True)
    return ipy.magic(f"timeit {exp}")

相关问题 更多 >