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

Python子目录脚本导入父目录模块时工作路径异常问题

问题原因

两个路径机制完全独立,不存在关联:

  • sys.path仅控制Python解释器查找导入模块的范围,修改它不会对进程的当前工作目录(CWD)产生任何影响
  • 所有文件操作传入的相对路径,默认以进程启动时的当前工作目录为基准解析,和脚本存放位置、sys.path配置无关。当你将childScript.py作为子进程启动时,如果父进程指定的工作目录是父目录,open('test', 'a')自然会在父目录下创建文件。
修复方案

不要依赖运行时的工作目录定位文件,所有需要固定和脚本存放位置绑定的路径,都基于脚本自身的__file__属性构造绝对路径即可,这种写法不受启动位置、子进程工作目录配置的影响,稳定性最高。

修改后的childScript.py(基于os模块实现,兼容所有Python版本):

import sys, os

# 提前获取当前脚本childScript.py所在的childDirectory绝对路径
CHILD_SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
# 原有导入父模块的逻辑,改用os.path.join拼接路径,适配不同操作系统的路径分隔符
sys.path.append(os.path.join(CHILD_SCRIPT_DIR, '..'))
import parentModule

def runChildMain():
    '''
    run runFunction from parentModule.py
    '''
    parentModule.runFunction()

    # 拼接test文件的绝对路径,固定生成在childDirectory目录下
    test_file_path = os.path.join(CHILD_SCRIPT_DIR, 'test')
    open(test_file_path, 'a').close()

runChildMain()

如果你使用Python 3.4及以上版本,也可以用标准库pathlib实现,代码更简洁:

import sys
from pathlib import Path

# 获取当前脚本所在目录的Path对象
CHILD_SCRIPT_DIR = Path(__file__).resolve().parent
# 将父目录加入模块搜索路径
sys.path.append(str(CHILD_SCRIPT_DIR.parent))
import parentModule

def runChildMain():
    parentModule.runFunction()
    # 直接拼接路径创建空文件,touch方法自带exist_ok参数避免重复创建报错
    (CHILD_SCRIPT_DIR / 'test').touch(exist_ok=True)

runChildMain()

注意:不推荐通过os.chdir(CHILD_SCRIPT_DIR)修改全局工作目录的方式解决问题,这种方式会改变整个进程的路径解析基准,如果后续代码需要处理用户传入的相对路径、或者其他依赖原始工作目录的逻辑,很容易引发隐蔽的路径错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:01:14