我有一個 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/
(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 所引起;更不是什麼鬼異的神秘事件!