Python 3.6导入自定义包失败(已尝试多种解决方案)
解决ModuleNotFoundError: No module named 'src'的问题
问题根源
当你通过python src/start_script.py直接运行脚本时,Python会把脚本所在的src目录添加到sys.path的最前面,而不是项目根目录。这时候你在start_script.py里写import src.lib1,Python会去src目录下找名为src的子目录,自然找不到,所以抛出模块不存在的错误。
下面是几种可行的解决方案,你可以根据自己的项目需求选择:
方案1:修改导入语句(最简单直接)
因为start_script.py和lib1都在src目录下,属于同一个包层级,你可以直接导入lib1,不需要加src.前缀:
# start_script.py import lib1
这种方法不需要修改脚本运行方式,适合小型项目或结构简单的场景。
方案2:以模块方式运行脚本(推荐的规范做法)
Python支持以包模块的方式运行脚本,这样会自动把项目根目录加入sys.path,符合Python的包结构规范。
步骤:
- 确保
src目录下有__init__.py文件(哪怕是空文件),让src成为一个合法的Python包:project | +---- __init__.py | +---- src | +---- __init__.py # 新增这个文件 | +---- start_script.py | +---- lib1 | +---- run.sh - 修改
run.sh里的最后一行,从python src/start_script.py改成:python -m src.start_script
这样运行时,Python会把项目根目录加入sys.path,import src.lib1就能正常找到src包下的lib1模块了。
方案3:手动添加项目根目录到sys.path
如果你不想修改导入语句或运行方式,可以在start_script.py开头添加代码,把项目根目录绝对路径加入sys.path:
# start_script.py 开头添加 import os import sys # 获取当前脚本所在目录的绝对路径 current_script_dir = os.path.abspath(os.path.dirname(__file__)) # 获取项目根目录(当前脚本目录的父目录) project_root = os.path.abspath(os.path.join(current_script_dir, '..')) # 把项目根目录加入sys.path sys.path.append(project_root) # 现在可以正常导入了 import src.lib1
这种方法避免了相对路径的问题,不管脚本在哪个目录执行,都能正确找到项目根目录。
内容的提问来源于stack exchange,提问作者Kadepp
相关产品推荐
相关产品推荐

