装了 protobuf 和另一个内部包之后 import google.protobuf 报 ModuleNotFoundError,但 pip list 里 protobuf 明明在。site-packages/google 下只剩一个空的 __init__.py。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,两个发行包都往 google 目录下写文件,其中一个带了 __init__.py,就把目录变成了普通包而不是命名空间包。普通包的查找只认那一个目录,另一个包的文件就看不见了。
「命名空间包冲突」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。
python -c "import google; print(google.__path__)" python -c "import google.protobuf; print(google.protobuf.__version__)" pip show -f protobuf
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,先看 site-packages/google 下是不是有 __init__.py 以及里面写了什么;用 pip show -f 对比两个包各自应该提供哪些文件;把带 __init__.py 的旧包升级 新版按 PEP 420 处理命名空间;清理现场重装 确认该目录下没有可执行的 __init__.py。
最后用这个标准收尾,google.__path__ 显示为命名空间路径 子模块 import 正常 protobuf 版本号能打印出来。
