背景
最近在进行多模块集成的时候,出现了import错误的现象,虽然直接用绝对目录解决了,但是显然不优雅,在复习了有关工作目录的知识后,了解到了问题所在。故写此博客,希望对读者有所帮助。
场景说明
有两个python文件,一个是A.py一个是B.py。
A文件import B文件,由于在同一个目录下,所以直接import B。
此时在上一层目录有一个文件C.py。C文件import了A文件,当运行C文件的时候会导致A文件 import B错误。
问题原因
工作目录(也称为当前工作目录或CWD)是文件系统中的一个目录,它决定了程序在查找文件时所使用的基准路径。在Python中,当你尝试打开一个文件、读取一个模块或其他资源时,如果你没有指定完整的路径,Python通常会相对于工作目录来查找这些资源。
当A.py尝试import B
时,Python解释器会在几个地方查找B.py:
- 内置模块(如
sys
、os
等)。 - 当前工作目录下的模块和包。
- PYTHONPATH环境变量中列出的目录。
- 标准库的安装位置。
- 第三方库的安装位置(如通过pip安装的库)。
如果B.py位于与A.py相同的目录中,并且当前工作目录不是该目录,则导入可能会失败,因为Python解释器会在当前工作目录下查找B.py,而不是A.py所在的目录。
此时的工作目录是C文件所在的目录,该目录下找不到B文件,所以 import B 会报错。
解决思路
-
显式指定路径:在打开文件或导入模块时,始终使用完整或相对于某个固定基准点的路径。例如,如果你知道B.py相对于A.py的位置,你可以使用
from . import B
(相对导入)或指定完整的包路径。 -
修改工作目录