Python切换工作目录后无法导入模块的问题排查
问题分析与解决方案
核心问题
你没有错误使用os.chdir,问题出在Python的模块搜索路径(sys.path)机制:切换当前工作目录只是改变了程序的文件操作上下文,但Python查找模块时只会遍历sys.path列表中的路径,不会自动将当前工作目录加入其中。所以即使你能列出application目录的内容,只要它不在sys.path里,就找不到utils模块。
解决当前util1.py的导入问题
直接将application目录添加到sys.path即可,无需切换工作目录:
import sys from os.path import dirname, abspath # 获取application目录的绝对路径 app_root = dirname(dirname(abspath(__file__))) # 避免重复添加路径 if app_root not in sys.path: sys.path.append(app_root) from utils import util1
注意:如果你的
utils目录下没有__init__.py文件,Python 3.3+会将其视为「命名空间包」也能导入,但建议添加一个空的__init__.py让结构更规范。
便捷访问application同级目录的大量模块
如果要访问application父目录下的其他模块(比如父目录为project,project下有application和other_modules等文件夹),只需将父目录添加到sys.path:
import sys from os.path import dirname, abspath # 获取application的父目录(即project目录) project_root = dirname(dirname(dirname(abspath(__file__)))) if project_root not in sys.path: sys.path.append(project_root) # 现在可以直接导入同级模块,例如: # from other_modules import some_module
额外提示
如果是长期开发的项目,更规范的做法是通过pyproject.toml或setup.py将项目配置为可安装包,开发时用pip install -e .安装为 editable 模式,这样无需手动修改sys.path就能直接导入所有模块。
内容的提问来源于stack exchange,提问作者ChronoVortex
相关产品推荐
相关产品推荐

