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

如何不修改sys.path导入父级子目录中以数字开头的Python脚本?

无需修改sys.path导入123myscript.py的方案

你的导入代码失败核心原因有两点:

  1. importlib.import_module 仅接受点分隔的模块层级名称,不支持文件路径,也不能带.py后缀
  2. 目录名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. 将1 UTILS重命名为utils_1或其他无空格的合法名称
  2. 在该目录下创建空的__init__.py,将其转为Python包
  3. 在2 TESTS目录下也创建__init__.py,将测试目录也转为包

之后即可用importlib完成相对导入:

import importlib

# 从上级目录的utils_1包导入123myscript模块
myscript = importlib.import_module(".utils_1.123myscript", package="2 TESTS")

不过这种方式需要修改目录名称,仅适合允许调整目录结构的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:31:03