同目录Python脚本导入问题求助:跨文件调用函数遇ModuleNotFoundError
解决Python相对导入报错的问题
你遇到的是Python模块导入里很常见的「直接运行脚本导致相对导入失效」的问题,结合你的目录结构咱们一步步来解决:
你的目录结构是:
module/ ├── __init__.py ├── sample.py └── tester.py
问题根源
当你直接运行tester.py(比如执行python tester.py或者python module/tester.py)时,Python会把这个脚本标记为__main__模块,而非将它归到module这个package下。这时候用相对导入from .sample import *就会报错——因为.对应的是当前package,但__main__并不属于任何package,自然找不到对应的模块。
可行解决方案
方案1:以Package形式运行(官方推荐)
这是最规范的做法,能完美适配相对导入逻辑。你需要从module目录的上级目录执行命令:
python -m module.tester
这样Python会把module识别为合法的package,此时tester.py里的from .sample import *就能正常工作,.指向的就是module这个package。
方案2:修改导入语句(适合快速测试)
如果你习惯直接运行tester.py(比如在module目录下执行python tester.py),可以把相对导入改成绝对导入——因为此时module目录已经在Python的sys.path里了,直接写:
from sample import *
就能成功导入sample.py里的内容。
方案3:兼容两种运行方式的写法
如果需要脚本既能直接运行,又能作为package的一部分被其他模块导入,可以用try-except做兼容处理:
try: # 当作为package的一部分运行时(比如用python -m命令) from .sample import * except ImportError: # 当直接运行脚本时 from sample import *
额外小提示
- 确保
__init__.py存在(你的目录里已经有了),这是Python识别package的标志,哪怕文件是空的也没关系。 - 尽量避免
from ... import *的写法,虽然省事但容易引发命名冲突,建议明确导入需要的函数,比如from .sample import func1, func2。
内容的提问来源于stack exchange,提问作者Kesav
相关产品推荐
相关产品推荐

