Python导入本地模块报错:ModuleNotFoundError: No module named 'common_lib'
嗨,我来帮你捋捋这个模块导入的坑!看了你的描述,你已经试了不少办法还是卡壳了,别着急,咱们一步步来解决:
先再明确下你的项目结构,方便大家理解问题根源:
my_project/ ├── common_lib/ │ ├── __init__.py │ ├── file1.py │ └── file2.py └── module1/ ├── src/ │ ├── __init__.py │ ├── script1.py │ └── script2.py ├── __init__.py └── main.py
你在main.py和script1.py里跨目录导入common_lib的函数,但在module1目录下运行python main.py时触发了找不到模块的错误,下面给你几个靠谱的解决思路:
方案1:切换到项目根目录运行脚本
这是最快捷的临时解法!你当前是在module1目录下运行脚本,Python的模块搜索路径默认是当前工作目录,它找不到上一级的common_lib。你只需要切换到my_project目录再执行脚本:
cd 你的my_project目录绝对路径 python module1/main.py
这样Python就能在项目根目录找到common_lib了,因为根目录会被自动加入到模块搜索路径中。
方案2:手动给Python添加模块搜索路径
如果你不想每次都切换目录,可以在要导入模块的脚本开头,手动把项目根目录加到Python的搜索路径里。比如在main.py的最开头加上这段代码:
import sys from pathlib import Path # 找到项目根目录(也就是my_project文件夹) project_root = Path(__file__).parent.parent # 把根目录加入到Python的模块搜索路径 sys.path.append(str(project_root)) # 现在再导入就没问题了 from common_lib.file1 import func1
同理,script1.py里也可以加类似的代码,只是要多往上跳一级目录:
import sys from pathlib import Path # script1在module1/src下,需要往上跳三级到my_project project_root = Path(__file__).parent.parent.parent sys.path.append(str(project_root)) from common_lib.file2 import func2
这段代码的好处是不管你在哪个目录运行脚本,都能正确定位到项目根目录,通用性拉满。
方案3:正确用setup.py安装本地模块
你提到已经用setup.py安装了common_lib,但大概率是安装方式不对。正确操作如下:
- 确保你的
setup.py放在my_project目录下,参考标准结构写:
from setuptools import setup, find_packages setup( name="common_lib", version="0.1", packages=find_packages(), )
- 打开PowerShell切换到
my_project目录,用开发模式安装:
cd path/to/my_project pip install -e .
这里的-e是开发模式的意思,它会把你的common_lib模块链接到Python的site-packages目录里,这样不管你在哪个目录运行脚本,Python都能直接找到它,而且你修改common_lib的代码后,不需要重新安装就能生效,特别适合开发阶段用。
关于环境变量和VSCode配置的小提醒
你之前修改了系统环境变量和VSCode的settings.json,但这些配置有时候不会立即生效(比如改了环境变量没重启PowerShell),而且依赖编辑器配置的话,换个终端或者电脑就又出问题了,所以还是上面的几种方法更靠谱。
备注:内容来源于stack exchange,提问作者SheCodes

