我正在尝试调用'timex.py'中定义的小辅助函数,该函数从'caller.py'调用,而后者应该通过“%run caller”从(PyCharm的)IPython-console调用。 PY”。
目前导致“NameError:name'pickle'未定义”。
# 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}")
# caller.py
import pickle
from timex import time_expression
packet = [*range(10**2)]
time_expression("pickle.dumps(packet, protocol=-1)")
# Then run from IPython-console:
>>>%run caller.py
time expression: pickle.dumps(packet, protocol=-1)
NameError: name 'pickle' is not defined
显然,ipython timeit-magic的命名空间不包含 caller.py-全局。将globals()作为time_expression的参数传递并从time_expression中更新全局变量没有帮助,并且传递get_ipython()作为参数不起作用。
有没有办法让它发挥作用?
如果我在caller.py
中定义time_expression并使用“ipython caller.py”从终端调用它,它可以工作,但我更喜欢将它放在库中,然后将其导入到需要的地方。
(Python 3.6.3,IPython 6.2.1)
答案 0 :(得分:0)
有点hacky,我现在觉得很脏;) 也许有更优雅的方式?
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}")