我开发了一个 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.