一、問題描述:
最近在使用 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:UsersXXXAppDataLocalJetBrainsPyCharmCE2020.3python_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
