当前位置: 首页 > news >正文

Python 引入中文py文件

目录

背景

思路

importlib介绍

使用方法

1.导入内置库

importlib.util

2.创建模块规格对象 

spec = importlib.util.spec_from_file_location("example_module", "example.py")

3.创建模块对象 

module = importlib.util.module_from_spec(spec)

4.绑定规格与对象(执行对应的模块) 

spec.loader.exec_module(module)

用法讲解

创建模块规格对象:为py文件创建一个规格对象,包含文件的路径、名称、加载器等信息

创建模块对象:创建一个新的,空的模块对象

绑定规格与对象:将规格信息绑定到对象中,此时module就具备了该py文件里所定义的类、函数等数据

具体示例

文件结构如下

【打印你好世界.py】文件内容如下

【import_chinese_file.py】 内容如下

运行【 import_chinese_file.py】 结果如下


背景

        博主在设置Django绑定的定时任务,设计逻辑是一个py文件就是处理对应的定时任务,然后觉得用英文命名一个py文件可能没那么直观,所以想用中文来命名,就遇到了引入中文的py的问题,有了解决方法后就用文章记录下来


思路

        不使用import直接导入中文py文件的模块(因为import 不能导入中文或特殊的符号),使用importlib进行处理模块的加载

importlib介绍

        importlib 是 Python 提供的强大的动态导入模块库,主要用于动态导入模块和处理模块加载。

使用方法

1.导入内置库

        importlib.util

2.创建模块规格对象 

        spec = importlib.util.spec_from_file_location("example_module", "example.py")

3.创建模块对象 

        module = importlib.util.module_from_spec(spec)

4.绑定规格与对象(执行对应的模块) 

        spec.loader.exec_module(module)

用法讲解

创建模块规格对象:为py文件创建一个规格对象,包含文件的路径、名称、加载器等信息

        example_module:是自定义的模块名称,仅为标识,不会有具体影响

        example.py:实际需要引入的py文件路径

        spec = importlib.util.spec_from_file_location("example_module", "example.py")

创建模块对象:创建一个新的,空的模块对象

        spec:对应的规格对象,一般搭配 importlib.util.spec_from_file_location() 使用

        module = importlib.util.module_from_spec(spec)

绑定规格与对象:将规格信息绑定到对象中,此时module就具备了该py文件里所定义的类、函数等数据

        注意:此时相当于已经执行了该py文件,例如py文件里面有print(1),将直接打印1

        spec:规格对象

        module:模块对象

        spec.loader.exec_module(module)

具体示例

文件结构如下

        【aa】文件夹下有【打印你好世界.py】文件,是用户引入的模块

        【bb】文件夹的文件是进行引入的代码文件

【打印你好世界.py】文件内容如下

【import_chinese_file.py】 内容如下

# 1.导入内置库
import importlib.util
import os
from pathlib import Path# 具体需要引入的文件路径
file_path = os.path.join(Path(__file__).resolve().parent.parent, "aa", "打印你好世界.py")# 创建规格对象
spec = importlib.util.spec_from_file_location("测试的中文模块", file_path)# 创建模块对象
module = importlib.util.module_from_spec(spec)# 绑定规格对象至模块中(执行对应模块)
spec.loader.exec_module(module)  # 此时该模块已导入成功(相当于已运行该py文件)# 获取py文件的aa对象
print(module.__getattribute__("aa"))# 获取py文件的hello_world函数对象
print(module.__getattribute__("hello_world"))# 执行py文件的hello_world函数
print(module.__getattribute__("hello_world")())# 调用不存在的对象或函数
print(module.__getattribute__("name"))

运行【 import_chinese_file.py】 结果如下

        注意是先打印【我是bb对象】然后再打印【我是aa对象】,是因为执行 spec.loader.exec_module(module) 就已经运行了该py文件

如果调用py文件不存在的对象就会执行报下面的错误,这里就能看得到自定义的规格对象名称

http://www.lryc.cn/news/375435.html

相关文章:

  • qt 实现模拟实际物体带速度的移动(水平、垂直、斜角度)——————附带完整代码
  • 驱动开发(三):内核层控制硬件层
  • 企业邮箱大附件无法上传?无法确认接收状态?这样解决就行
  • Kotlin 数据类(Data Class)
  • gridview自带编辑功能如何判断用户修改的值的合法性
  • 设计模式-结构型-06-桥接模式
  • 安泰电压放大器的选型原则是什么
  • 方法分享 |公网IP怎么指定非433端口实现https访问
  • vue实现拖拽元素;vuedraggable拖拽插件
  • Javascript介绍
  • 毕业答辩PPT:如何在短时间内高效准备?
  • 树结构与算法-杨辉三角形的两种实现
  • 【机器学习】智能创意工厂:机器学习驱动的AIGC,打造未来内容新生态
  • Python - 一个恶意脚本
  • SFNC —— 采集控制(四)
  • AUTOSAR学习
  • 区区微服务,何足挂齿?
  • 数据结构 ->反转链表
  • Unity基础(一)unity的下载与安装
  • TOP10!YashanDB斩获广东省优秀信创产品与解决方案双料荣誉
  • 基于深度学习网络的USB摄像头实时视频采集与手势检测识别matlab仿真
  • 有趣且重要的JS知识合集(22)树相关的算法
  • 使用 Let’s Encrypt 生成免费 SSL 证书
  • 【电脑小白】装机从认识电脑部件开始
  • ssldump一键分析网络流量(KALI工具系列二十二)
  • 使用seq2seq架构实现英译法
  • 攻防演练“轻装上阵” | 亚信安全信舱ForCloud 打造全栈防护新策略
  • 在Android Studio中将某个文件移出Git版本管理
  • Vue46-render函数
  • @RequestParam 和 @PathVariable @Param注解的区别和作用