首页 > 解决方案 > 如何使 zipimporter 模块自包含

问题描述

为不清楚的标题提前道歉。问题将在下面变得清晰。

我有一个目录main.py和一堆支持文件a.pyb.py例如。main.py做这个:

from a import func_a, Class_a
from b import func_b, Class_b

run_name = sys.argv[1]

def main():
    # do stuff

if __name__ == '__main__':
    file_names = ['main.py', 'a.py', 'b.py', 'c.py']
    # `archive` implementation available on request
    archive(f'runs/{run_name}.zip', file_names)
    main()

因此,我正在有效地尝试保持(几乎)完全可重复的“跑步”记录。

如果以后我想重现我使用的运行reproduce.py

import sys
import zipimport

script_name = sys.argv[1]
run_name = sys.argv[2]

importer = zipimport.zipimporter(f'runs/{run_name}.zip')
module = importer.load_module('main')

main = module.main
main.main()

这就是问题所在。我注意到module.main实际上是在我的工作目录中导入a.pyand b.py,而不是从 zip 存档中导入的。我希望它从 zip 存档中加载。使事情进一步复杂化的是a.py和/或b.py​​可能从c.py

标签: pythonpython-import

解决方案


推荐阅读