You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接从gzip压缩文件导入Python模块common_types?

直接从gzip压缩文件导入Python模块的方案

方案1:单次导入的简便实现

无需解压到临时文件,直接读取压缩内容并加载为模块,还能注册到系统模块表方便后续直接import:

import gzip
import importlib.util
import sys

def import_from_gzip(module_name, gzip_file_path):
    # 创建空模块对象
    module_spec = importlib.util.spec_from_loader(module_name, loader=None)
    module = importlib.util.module_from_spec(module_spec)
    # 读取gzip中的源码
    with gzip.open(gzip_file_path, 'rt', encoding='utf-8') as f:
        source_code = f.read()
    # 在模块命名空间内执行源码
    exec(source_code, module.__dict__)
    # 注册到sys.modules,后续可直接import
    sys.modules[module_name] = module
    return module

# 使用示例
common_types = import_from_gzip("common_types", "/path/common_types.py.gz")
# 之后可正常调用模块内容,比如 common_types.YourFunction()

方案2:全局导入钩子(一劳永逸)

通过自定义Python导入系统的查找器和加载器,让import语句自动识别.py.gz格式的模块,设置一次后所有符合条件的压缩模块都能直接导入:

import gzip
import importlib.abc
import importlib.util
import sys
import os

class GzipModuleLoader(importlib.abc.SourceLoader):
    def __init__(self, file_path):
        self.file_path = file_path

    def get_data(self, path):
        # 读取并返回gzip文件的源码内容
        with gzip.open(path, 'rt', encoding='utf-8') as f:
            return f.read().encode('utf-8')

    def get_filename(self, fullname):
        return self.file_path

class GzipModuleFinder(importlib.abc.MetaPathFinder):
    def find_spec(self, fullname, path, target=None):
        # 确定模块的搜索路径
        search_paths = sys.path if path is None else path
        module_basename = fullname.split('.')[-1] + '.py.gz'

        # 遍历搜索路径查找对应的压缩模块文件
        for search_path in search_paths:
            module_full_path = os.path.join(search_path, module_basename)
            if os.path.exists(module_full_path):
                return importlib.util.spec_from_loader(
                    fullname,
                    GzipModuleLoader(module_full_path),
                    origin=module_full_path
                )
        return None

# 注册自定义查找器到导入系统
sys.meta_path.insert(0, GzipModuleFinder())

# 现在可以直接import压缩模块了
import common_types

注意事项

  • 确保gzip压缩的Python文件使用UTF-8编码,避免读取时出现编码错误
  • 若需要导入嵌套包(包含__init__.py.gz的目录),需调整查找器逻辑以支持包的层级查找

内容的提问来源于stack exchange,提问作者Brad Leibovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:52:18