一、问题描述:
最近在使用 PyQt5 时,发现程序可以正常运行,但 PyCharm 中关于 PyQt 的代码无法智能提示和跳转,出现“cannot find declaration to go to”错误
二、出错环境:
- 完全重装了 Python 和 Pycharm
- 项目代码在之前其它电脑的环境中正常,可正常跳转
- 我使用的是 pipenv 虚拟环境,项目的依赖包和环境是独立的,并且换环境后依赖 Pipfile 可恢复原始环境
三、排除过程:
网上百度了一大堆,国内的国外的都看了,主要有以下几个解决办法(最后都对我无效):
1、项目工程的 “Python Interpreter” 未正确配置
排除:如果还有这种低级的错误就不要上来百度了,先把基本功打扎实
2、File Types 中的 Text 要排除掉 __init.py__文件
检查:完全重装的环境和软件,不存在这个问题
3、把工程目录设置为 根目录:
检查:代码一直在用,也不存在这个问题
四、解决思路:
既然上面的方法都试过了解决不了问题,那么就从根源上排查解决
- 回到之前电脑上的环境,进入 PyQt 相关代码,测试一下跳转,看代码最终跳转到了哪里,结果是跳转到 Pycharm 缓存目录下几级的一个叫 python_stubs 目录:C:\Users\XXX\AppData\Local\JetBrains\PyCharmCE2020.3\python_stubs\-1263808890
- 这里有个目录 叫 PyQt5 ,这下面存放了相关的代码,原来是在这里啊。事后得知这是伪代码:当我们调用的函数是内置函数或仅二进制存在的函数(没有py文件,只有pyc等)时,pycharm会对某个版本进行硬编码而生成的伪函数(实际不是调用的这个,只是方便我们做开发)
- 为什么出错的环境上没有这份代码呢?检查 Pipfile 中并没有 “pyqt5-stubs” 相关项,只有PyQt5 和 PyQt5-tools。换环境后,pycharm 也提示了我安装,但并没有生效,不知道这个工具是不是有BUG
五、最终解决办法:
有了以上分析,解决办法就很简单了,使用 pip 命令行安装 pyqt5-stubs 即可
pipenv install pyqt5-stubs
因我的环境是虚拟环境故使用 pipenv ,你们只需用 pip 即可
六、验证:
- 新环境中,python_stubs 目录下也有了 PyQt5 相关代码(Pipfile 也有了"pyqt5-stubs")
- Pycharm 的项目工程“Python Interpreter”中也有了这个包,如下图
-
- 问题最终解决,代码可跳转,也有代码提示失。
- 回到原先的环境中, pyqt5-stubs 只是辅助代码编写,项目运行并不依赖,故并不打包在 Pipfile 中,项目换环境时,它理所当然会丢
七、反思:
- 不要过分相信 IDE工具,自己一行一行配置的最为可靠
- 以后做工程项目时,把每一个依赖的库都配置到 Pipfile 中,确保不会出问题。主环境中尽量不要有残余依赖包,否则当回不到原先环境时,对比的对象都没有
- 学会从源头上找问题,盲目尝试效果甚微。
尊重原创成果,转载请注明出处:https://blog.csdn.net/MahoneSun/article/details/115385098