如何不修改sys.path导入父级子目录中以数字开头的Python脚本?
无需修改sys.path导入123myscript.py的方案
你的导入代码失败核心原因有两点:
importlib.import_module仅接受点分隔的模块层级名称,不支持文件路径,也不能带.py后缀- 目录名
1 UTILS包含空格,不符合Python模块命名规范(模块名必须是合法标识符,不能含空格),无法直接用常规包导入语法处理
以下是两种可行的实现方式:
方式一:用importlib.util直接加载脚本文件
这种方式无需添加__init__.py,直接通过文件路径加载目标脚本:
import importlib.util import os # 构造目标脚本的绝对路径 script_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "../1 UTILS/123myscript.py" ) script_path = os.path.normpath(script_path) # 标准化路径,消除../这类相对路径标识 # 创建模块规格对象 spec = importlib.util.spec_from_file_location("123myscript", script_path) # 基于规格创建模块对象 myscript = importlib.util.module_from_spec(spec) # 执行模块代码完成加载 spec.loader.exec_module(myscript) # 加载完成后,即可调用模块内的内容,例如 myscript.xxx_function()
方式二:调整目录结构适配包导入(可选)
如果希望贴近常规包导入逻辑,需要先修正目录命名的问题:
- 将
1 UTILS重命名为utils_1或其他无空格的合法名称 - 在该目录下创建空的
__init__.py,将其转为Python包 - 在
2 TESTS目录下也创建__init__.py,将测试目录也转为包
之后即可用importlib完成相对导入:
import importlib # 从上级目录的utils_1包导入123myscript模块 myscript = importlib.import_module(".utils_1.123myscript", package="2 TESTS")
不过这种方式需要修改目录名称,仅适合允许调整目录结构的场景。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

