Skip to content

Instantly share code, notes, and snippets.

@AlanJui
Last active November 27, 2020 14:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlanJui/e6b9067e45a708c1e6267d3556dcfb9f to your computer and use it in GitHub Desktop.
Save AlanJui/e6b9067e45a708c1e6267d3556dcfb9f to your computer and use it in GitHub Desktop.
可以正常編輯、執行的 Django 專案,卻總是看到由 Pyright 發出的錯誤警示。 [Pyright (reportMissingImports)] [E] Import "django.xxx" could not be resolved

我有一個 Django 專案,可以進行程式碼編輯;也能正常啟動及執行(python manage.py runserver)。

但很奇怪,在 Nvim 編輯器裡,總是會看到「由 Pyright 發出的錯誤警示訊息,告知我 django module 無法正常匯入」:

由於,使用 Nvim 編輯原始程式碼時,auto-completion 能正常運作,所以,故而推斷:Virtualenv、Python interpreter、 coc.nvim 及 coc-python 這些該有的設定,應為正確無誤。但為什麼 Pyright 卻老是認定:無法 import django 模組呢?!

在網路上找尋問題的解答許久,在幾乎放棄的時候,竟意外的看到了這篇發文 https://hanspinckaers.com/fixing-coc-pyright-and-anaconda-import-errors ,故而推斷我的問題,其導因很可能出自:「專案根目錄未放置 Pyright 設定檔(configuration file)所致」。

經過下述之驗證作業後,終於透過實驗證實,上述問題導因之判斷是正確的。


作業環境摘要:

  • 作業系統: macOS Catalina (V10.15.7)
  • 使用者帳號: alanjui
  • 編輯器: Nvim V0.5.0 Beta 版
  • Python 作業環境:
    • Python 版本管理工具:使用 pyenv 管控 python 直譯器的版本
    • Python 虛擬環境管理工具:使用 pyenv 的 plugin : pyenv-virtualenv 管理「虛擬環境」;
    • 預設 Python 版本:使用 pyenv global 3.8.5 指令,將 3.8.5 這版本,設定成系統預設的 python 直譯器。

基於上述,我的「作業環境」有如下之預設:

(1)個人家目錄:位於「目錄路徑」: /Users/alanjui/ ,所以 ~/.pyenv/ 表: /Users/alanjui/.pyenv/ ;或 $HOME/.pyenv/

(2)環境變數 $HOME ,表「目錄路徑」: /Users/alanjui/

(3)使用 pyenv version 指令,查詢作業系統中「預設的 python 2 及 python 3 直譯器」,可看到如下畫面:

$ pyenv version
3.8.5 (set by /Users/alanjui/.pyenv/version)
2.7.16 (set by /Users/alanjui/.pyenv/version)

(4)使用 pyenv versions 指令,查詢作業系統已安裝之 Python 版本及已建置之「虛擬環境」:

$ pyenv versions
  system
* 2.7.16 (set by /Users/alanjui/.pyenv/version)
  3.8.3
* 3.8.5 (set by /Users/alanjui/.pyenv/version)
  3.8.5/envs/django-3.8.5
  3.8.5/envs/my-dev
  3.8.5/envs/my_venv
  3.8.5/envs/neovim
  django-3.8.5
  my-dev
  my_venv
  neovim

(5)基於 python 3.8.5 ,所建立之「虛擬環境」,其存放目錄,應會置於如下之「目錄路徑」處: ~/.pyenv/versions/3.8.5/envs/

$ ll /Users/alanjui/.pyenv/versions/3.8.5/envs
total 0
drwxr-xr-x  8 alanjui  staff   256B 10 22 17:55 django-3.8.5
drwxr-xr-x  7 alanjui  staff   224B 11 24 15:30 my-dev
drwxr-xr-x  7 alanjui  staff   224B 11 11 15:05 my_venv
drwxr-xr-x  7 alanjui  staff   224B 11 20 12:37 neovim

專案環境摘要:

(1)Django 專案存放之目錄路徑處: ~/workspace/django/

(2)新的 Django 專案,規劃如下:

  • 專案名稱: test-002
  • 專案目錄路徑: ~/workspace/django/test-002/
  • 專案使用虛擬環境名稱: test-002
  • 專案虛擬環境目錄路徑: ~/.pyenv/versions/3.8.5/envs/test-002/

Pyright 環境設定檔建置作業程序:

(1) 建立並進入「專案目錄」。

$ cd ~/workspace/django
$ mkdir test-002 && cd $_

(2) 建立專案使用的虛擬環境。虛擬環境基於「python 3.8.5」進行建置,其名稱設為:「test-002」。並驗證虛擬環境(virtualenv): test-002 已被建立。

$ pyenv virtualenv 3.8.5 test-002

$ pyenv versions
  system
* 2.7.16 (set by /Users/alanjui/.pyenv/version)
  3.8.3
* 3.8.5 (set by /Users/alanjui/.pyenv/version)
  3.8.5/envs/django-3.8.5
  3.8.5/envs/test-002
  ......
  django-3.8.5
  test-002

(3) 使用 pyenv local <Virtualenv_Name> 指令,設定專案自動啟用「虛擬環境:test-002」。(pyenv local 指令,會在「專案根目錄」處,自動建立名為: .python-version 的檔案,用以輔助 pyenv 辦別專案所使用的「虛擬環境」為何者 )

$ pyenv local test-002

$ pyenv version
test-002 (set by /Users/alanjui/workspace/django/test-002/.python-version)

(4) 驗證虛擬環境:test-002 ,已建立相關之目錄(test-002),置於下列「目錄路徑」處。

$ ll /Users/alanjui/.pyenv/versions/3.8.5/envs
total 0
drwxr-xr-x  8 alanjui  staff   256B 10 22 17:55 django-3.8.5
......
drwxr-xr-x  7 alanjui  staff   224B 11 24 21:32 test-002

(5) 建立 Pyright 的環境設定檔,檔名為: pyrightconfig.json ,並置於「專案目錄」的「根目錄」處。因此,pyright 設定檔的存放路徑為:~/workspace/django/test-002/pyrightconfig.json

$ cd ~/workspace/django/test-002
$ touch pyrightconfig.json
$ vim pyrightconfig.json

pyrightconfig.json 環境設定檔內,應有的設定內容:

{
  "venvPath": "/Users/alanjui/.pyenv/versions/3.8.5/envs",
  "venv": "test-002"
}
  • venvPath :表「專案虛擬環境」存放的目錄路徑
  • venv :表「專案虛擬環境」的名稱。

【要特別小心的陷阱】:設定 venvPath 時,一定要使用「全路徑名稱」,不能簡化成下列兩種寫法...

  • ~/.pyenv/versions/3.8.5/envs
  • $HOME/.pyenv/versions/3.8.5/envs

後記

最後,我終於找到「沒有刻意啟用 Pyright ;卻會發生 Pyright 對我程式碼有意見的導因」。原來是因為 Nvim 的作業環境設定,採用了某大神在以下網址處的設定檔: https://github.com/ChristianChiarulli/nvim

剛好,這位 ChrisAtMachine 大神也是 coc.nvim 的愛用者,在他的 coc-extensions.vim (Vim Plugin 設定檔),設定採用 coc.nvim 的 extensions: coc-pyright 。所以,整個災難的起頭,源自此處;並不是因 Nvim 0.5 所引起;更不是什麼鬼異的神秘事件!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment