我有一个试图从命令行运行的脚本:
import ipdb
def f(): pass
import pickle
pickle.dumps(f)
这当然是简化的。实际上,我正在尝试f
在 a中使用multiprocessing.Pool
,因此需要对其进行腌制。使用 ipython 5.3.0 和 ipdb 0.10.2 这会产生:
PicklingError: Can't pickle <function f at 0x1071eaaa0>: it's not found as __main__.f
我相信这是因为 IPython 被覆盖,如此处sys.modules['__main__']
所述。
我想解决这个问题。我的一个想法是sys.modules['__main__']
用当前模块替换。我可以在导入 ipdb 之前获得此参考,但我想避免这种情况(出于超出此问题范围的相当复杂的原因)。
在被覆盖后是否可以获得对当前模块的引用sys.modules
?我看到我可以得到它的名字(__main__
在我的例子中),但我不知道如何获得它的价值(除了通过查看sys.modules
)。