同一Python环境下解释器可导入src,脚本执行提示“No module named `src`”
问题分析与解决
你的核心问题是:未安装目标包的情况下,脚本中使用importlib.util.find_spec(modulename, package='package_name')或导入src模块失败,但交互式解释器中可以正常运行。
根源
- 交互式解释器会自动把当前工作目录加入模块搜索路径
sys.path,但脚本执行时,Python只会把脚本所在目录加入sys.path(如果运行路径不是脚本所在目录,就会漏加仓库根目录)。 setup.py里的package_dir={'package_name': 'src'}是给setuptools用的,未安装包时,Python本身不知道package_name和src的映射关系,直接用package='package_name'调用find_spec会找不到包。
解决办法
1. 强制把仓库根目录加入模块搜索路径
在脚本最开头添加代码,确保仓库根目录在sys.path最前面:
import sys from pathlib import Path # 自动获取仓库根目录(假设脚本在根目录下,或能通过setup.py定位) repo_root = Path(__file__).parent sys.path.insert(0, str(repo_root))
2. 手动映射package_name到src目录
如果必须用package='package_name'作为查找前缀,手动把src目录注册为package_name包:
import sys import importlib.util from pathlib import Path repo_root = Path(__file__).parent src_dir = repo_root / "src" # 创建并加载package_name包的spec spec = importlib.util.spec_from_file_location("package_name", src_dir / "__init__.py") package_name = importlib.util.module_from_spec(spec) sys.modules["package_name"] = package_name spec.loader.exec_module(package_name) # 现在可以正常调用find_spec target_spec = importlib.util.find_spec(modulename, package='package_name')
3. 开发模式安装包(最省心)
在仓库根目录执行以下命令,以开发模式安装包,让setuptools自动处理路径映射:
pip install -e .
安装后,无论是解释器还是脚本,都能直接用package_name作为包名操作。
排查技巧
在脚本和解释器中分别执行以下代码,对比sys.path的内容,就能快速定位路径问题:
import sys print(sys.path)
内容的提问来源于stack exchange,提问作者Zorgoth
相关产品推荐
相关产品推荐

