公司动态

importlib模块

📅 2026/7/29 13:54:04
importlib模块
一、动态导入import_module语法importlib.import_module(name, packageNone) name (必填)要导入的模块名称可以是绝对名称如 os.path也可以是相对名称以点开头如 .submodule。 package (选填)仅当 name 是相对名称时必须提供用于指定“锚点”包。通常传入当前模块的 __package__ 属性或者当前包的名字。 返回值成功则返回导入的模块对象失败则抛出 ImportError示例代码(一)module/info.pydef student(name,age): print(f姓名:{name}\n年龄:{age}岁) if __name__ __main__: student(张三一,26)01import_module.pyimport importlib info1importlib.import_module(namemodule.info) # 切记参数name.infoinfo前有一个点 info2 importlib.import_module(name.info, packagemodule) info1与info2等价 info1中namemodule.info写的是绝对路径因此不需要传入package参数 而 info2中name.info传入的是相对路径因此需要传入package参数 info1.student(张三一,26) print(-*19) info2.student(张三一,26)01import_module.py运行结果姓名:张三一 年龄:26岁 ------------------- 姓名:张三一 年龄:26岁示例代码(二):module/company.pyclass worker(): def name(self): print(姓名:李靖) def age(self): print(年龄:66岁) def address(self): print(地址:大唐长安)02importlib_module2.pyimport importlib companyimportlib.import_module(namemodule.company) workercompany.worker() # 下面输入worker.后函数名称是可以自动提示的 worker.name() worker.age() worker.address()02importlib_module2.py运行结果C:\Users\asus\anaconda3\python.exe D:\My Program\study_project\06importlib\01.py 姓名:李靖 年龄:66岁 地址:大唐长安 进程已结束,退出代码0二、 模块重载reload语法import importlib importlib.reload(module) 参数必须是一个已经导入过的模块对象不能是字符串也不能是未导入的模块。 返回值返回重新加载后的模块对象其实就是传进去的那个对象但在内存中被刷新了。 作用强制 Python 重新执行该模块的顶层代码并用新的内容更新 sys.modules 缓存。示例代码module/calc.py# calc.py x 10 def add(a, b): return a b03reload.pyimport importlib import time from module import calc print(calc.x) # 输出 10 print(calc.add(2, 3)) # 输出 5 for i in range(10): time.sleep(1) print(f等待{i 1}秒...) # ---在这个等待的时间如果修改了 calc.py把 x 改成 20add 改成 a - b ---并按CtrlS保存module/calc.py # 修改后不重启 Python直接调用 reload importlib.reload(calc) # 重新加载 print(calc.x) # 输出 20 ✅ print(calc.add(2, 3)) # 输出 -1 ✅03reload.py运行结果C:\Users\asus\anaconda3\python.exe D:\My Program\study_project\06importlib\03reload.py 10 5 等待1秒... 等待2秒... 等待3秒... 等待4秒... 等待5秒... 等待6秒... 等待7秒... 等待8秒... 等待9秒... 等待10秒... 20 -1 进程已结束,退出代码0三、现代化资源管理resources⭐⭐⭐⭐⭐ 重点(一)为什么要用它解决两大噩梦告别__file__拼路径不会因为打包成 EXE 或运行在临时目录而找不到文件。告别手动复制资源打包时自动将文件嵌入 EXE 内部无需手动拷贝。(二)核心前提第一个坑__init__.py铁律被读取的文件夹必须是一个“Python 包”而不是普通文件夹。错误结构导致TypeError: ... NoneTypeloadfile/ -- 只是个普通文件夹没有 __init__.py └── config.txt正确结构必须加空文件loadfile/ -- 这是一个“包” ├── __init__.py -- 必须存在可以为空 └── config.txt(三)读取文件 API区分大小和场景1. 小文件几 KB ~ 几 MB—— 一次性读取读取文本files(包名).joinpath(文件名).read_text(encodingutf-8)读取二进制files(包名).joinpath(文件名).read_bytes()2. 大文件避免内存溢出—— 流式/分批读取第二个坑不能用read_text()改用.open()配合循环。from importlib.resources import files resource files(loadfile).joinpath(big_log.txt) # 方式一按行读取最省内存适合文本 with resource.open(r, encodingutf-8) as f: for line in f: process(line) # 逐行处理 # 方式二按字节块读取适合二进制或超大文件 with resource.open(rb) as f: while chunk : f.read(4096): # 每次读 4KB process(chunk)3. 第三方库需要“真实路径”时 —— 使用as_file()如果pandas.read_csv()或PIL.Image.open()不接受字节流只认文件路径用这个from importlib.resources import files, as_file resource files(loadfile).joinpath(data.csv) with as_file(resource) as path: # 自动生成临时真实文件路径 df pd.read_csv(path) # 完美兼容(四)打包部署解决手动复制文件的噩梦前提你的代码必须使用importlib.resources而不是__file__。1. 用 PyInstaller 打包成单个 EXE命令在终端运行# Windows 系统注意分号 ; pyinstaller -F --add-data loadfile;loadfile 04.py # Mac/Linux 系统注意冒号 : pyinstaller -F --add-data loadfile:loadfile 04.py -F打包成单文件 EXE。 --add-data 本地文件夹;打包后文件夹将整个资源包打进 EXE 内部。2. 使用.spec文件一劳永逸如果资源很多每次敲命令太麻烦生成一个配置文件pyi-makespec 04.py然后在生成的04.spec文件中找到datas列表添加上你的资源包a Analysis( [04.py], datas[(loadfile, loadfile), (images, images)], # 自动打包所有资源 ... )以后只需要运行pyinstaller 04.spec即可无需反复敲参数。(五)重要提醒关于“写入”文件第三个坑importlib.resources只能“读取”不能“写入”。EXE 内部的资源文件是只读的。正确做法程序首次运行时用resources读取默认配置然后用普通的open()在当前用户目录如os.getcwd()或AppData下生成副本。以后修改和写入都针对副本操作。这样既保留了原版配置又支持用户自定义修改。(六)常见错误清单帮你快速排雷错误现象根本原因解决方案TypeError: expected str, bytes ... not NoneType资源文件夹没有__init__.py在文件夹里新建一个空的__init__.py读取大文件时内存爆满 / 程序卡死错误使用了read_text()一次性读入改用.open()for line in f逐行读取打包后 EXE 运行报错“文件找不到”代码用了__file__拼接路径换成importlib.resources写法打包后资源文件不存在打包时忘了加--add-data参数打包命令加上--add-data 包名;包名as_file()报错或无法释放忘记用with上下文管理器必须写成with as_file(resource) as path:(七)总结你的“心法口诀”资源文件夹必须加__init__.py这是包的身份证。小文件read_text大文件open循环。传给第三方库用as_file打包时带上--add-data。只读不写改动副本内存安全打包无忧。四、查找器Finder与加载器Loader五、元数据读取metadata姊妹模块