如何使用 dill 将输入存储到也被其他人用作子模块的 python 模块?

问题描述 投票:0回答:0

我开发了一个 python 模块,MyModule。用户将其添加为 git 子模块,并导入多个类和函数。

from MyModule.MyModuleSubfolder import ClassA
from MyModule.MyModuleSubfolder import ClassB
from MyModule.MyModuleOtherSubfolder import useful_function

用户提供给 useful_function 的输入是一个非常复杂的字典,其字段可能是字典/列表/非常大的 numpy 数组等。我想使用 dill(或任何其他替代方法)将此输入存储在 useful_function 中,所以我可以在 useful_function 中阅读它以进行调试。

我实现了这样的事情(我省略了所有文件打开/关闭行,它们是不相关的):

...
input_dict['file_path'] = "folder\input_file.pkl"
...


def useful_function(input_dict,load_flag=False):
    if load_flag:
        input_dict = dill.load(input_dict['file_path'],...)
    else:
        dill.dump(input_dict,...)

当我在将 MyModule 作为独立项目运行时或当用户将 MyModule 用作 git 子模块时对其进行测试时,它工作得非常好:我们都可以写入文件并读取它们。 但是,当我将用户(将我的代码作为子模块运行)作为独立项目运行时,尝试加载用户创建的 input_file.pkl 时,出现

ModuleNotFoundError: No module named 'MyModule'
错误,之前在几个类似的问题中对此进行了讨论(比如这里)。然而,情况有点不同,所以“mainify”解决方案对我来说并不好。首先,我不想转储 MyModule 中定义的任何类,只是一个(非常复杂的)字典,所以原则上可能有一种方法可以存储这个字典,同时不知道 main 中是否存在任何导入,但是pickle/dill(以及其他使用/扩展 pickle 的库)确实需要保存来自 main.
的所有导入 其次,我无法控制用户,它可以导入任意数量的 MyModule 文件,甚至是我无权访问的其他库,所以我无法预先维护所有内容。 你有更好的解决方案吗?

python pickle git-submodules dill
© www.soinside.com 2019 - 2024. All rights reserved.