1. 程式人生 > 其它 >搭建 PyCharm + WSL2 開發環境並配置 PyMesh 庫

搭建 PyCharm + WSL2 開發環境並配置 PyMesh 庫

目錄

測試環境

Windows 10 家庭中文版(64位) 1909
Ubuntu 20.04 LTS(WSL2) + Python 3.8.10
PyCharm Professional 2021.3.3

1. 配置 Linux 子系統 (WSL2)

注意,啟用子系統需要開啟 Hyper-V 功能,而 家庭中文版

預設情況下不提供,需要自己手動開啟。

要啟用 Hyper-V,請將下面的命令儲存為 .cmd 檔案並使用 管理員身份 執行:

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

1.1. Windows 版本 ≥ 2004

自 2004 版本以後,wsl 可以通過下面的命令直接安裝,非常方便:

wsl.exe --install

不過作者的系統版本沒有 2004 且不打算升級,所以沒有測試,可以看看下面的參考文章:

參考連結

1.2. Windows 版本 < 2004

下面的步驟提煉自 參考連結 ,想自己折騰的可以直接看原文。

1.2.1. 啟用適用於 Linux 的 Windows 子系統

以管理員身份開啟 PowerShell,執行下面的命令:
提示:右鍵 “開始” 選單,單擊 “Windows PowerShell (管理員)”。

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

1.2.2. 檢查執行 WSL 2 的要求

  • 對於 x64 系統:版本 1903 或更高版本,採用內部版本 18362 或更高版本。
  • 對於 ARM64 系統:版本 2004 或更高版本,採用內部版本 19041 或更高版本。
  • 低於 18362 的版本不支援 WSL 2。

1.2.3. 啟用 Hyper-V 虛擬機器功能

注意:在本節開始處啟用過的可以跳過這一步。

以管理員身份開啟 PowerShell 並執行:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

1.2.4. 下載並安裝 Linux 核心更新包

下載連結:適用於 x64 計算機的 WSL2 Linux 核心更新包

1.2.5. 將 WSL 2 設定為預設版本

WSL 預設版本是 WSL 1,開啟 PowerShell,執行以下命令,將 WSL 2 設定為預設版本:

wsl --set-default-version 2

1.2.6. 安裝 Linux 分發版

開啟 Microsoft Store, 搜尋 wsl 或想要使用的版本,如 Ubuntu、openSUSE 等,獲取安裝即可。

注意,安裝完成後,需要開啟新安裝的 Linux 系統,設定使用者名稱和密碼之後就可以使用了(參考連結)。

在這一步之後,在 PowerShell 中執行下面的命令就可以看到已經安裝的 Linux 子系統列表:

wsl -l

2. 下載、編譯並安裝 PyMesh 庫

2.1. 從 Github 下載 PyMesh 原始碼包

提示:子系統可以從 /mnt 目錄訪問 Windows 系統上的資源,比如 Windows 上的 D:\Downloads,在子系統上就是 /mnt/d/Downloads。

這一步及後續步驟建議在 Windows 系統上進行!!!

如果 Windows 上沒有安裝 Git,建議安裝一下,下載頁面

在磁碟上找一個相對固定的位置建一個目錄,比如 D:\GitRepo,用於存放下載的原始碼倉庫。

然後進入這個目錄,在空白處右鍵,選擇 Git Bash Here,進入包含 Git 工具的命令列環境。

執行下面的命令將 PyMesh 原始碼倉庫克隆到本地:

git clone https://github.com/PyMesh/PyMesh.git

下載完成後,目錄下會多出來一個 PyMesh 目錄。

2.1.1. 解決下載過慢的問題

由於 Github 伺服器在國外,所以可能會出現速度過慢的情況,有兩種解決方案:

  1. 使用 FastGit 加速下載。
    教程請訪問這裡

  2. 為 Git 設定代理,需要你瞭解 “相關知識”
    在 Git Bash 中執行下面的命令設定代理(以我的代理預設設定為例):

git config --global http.proxy http://127.0.0.1:10809
git config --global https.proxy https://127.0.0.1:10809

以上命令最後的 url 需要更換成你的代理連結。

附上取消代理的命令:

git config --global --unset http.proxy
git config --global --unset https.proxy

2.1.2. 遞迴克隆倉庫中的第三方原始碼倉庫

PyMesh 本身也使用了很多其他的開源庫,所以在目錄下有一個 .gitmodules 檔案,記錄了使用的第三方倉庫及其連結,我們同樣需要將它們克隆下來。

還是在 Git Bash 中執行命令:

git submodule update --init --recursive

這一步也比較漫長,可以花費數十分鐘,所以還是建議設定代理之後下載。

2.2. 安裝 PyMesh 需要的系統依賴庫

這裡使用 Ubuntu 系統為例,首次使用 apt 時,需要先更新一下軟體源清單:

sudo apt update -y

執行以下命令:

sudo apt-get install \
libeigen3-dev \
libgmp-dev \
libgmpxx4ldbl \
libmpfr-dev \
libboost-dev \
libboost-thread-dev \
libtbb-dev \
python3-dev

安裝完成後,執行下面的命令檢視 Python 版本:

python --version

但可能會出現找不到 python 命令的提示,比如:

Command 'python' not found, did you mean:
command 'python3' from deb python3
command 'python' from deb python-is-python3

對於這種情況,需要將 /usr/bin/python3 連結到 /usr/bin/python,命令如下:

update-alternatives --install /usr/bin/python python /usr/bin/python3 1

2.3. 安裝 PyMesh 需要的 Python 依賴庫

首先安裝 pip:

sudo apt install python3-pip

然後在 Ubuntu 下進入到 PyMesh 原始碼倉庫目錄(以 D:\GitRepo\PyMesh 為例):

cd /mnt/d/GitRepo/PyMesh

為了方便起見,將此路徑新增到環境變數:

export PYMESH_PATH=$PWD

在此,可以通過回傳看看是否新增正確:

echo $PYMESH_PATH

如果正確,會顯示 /mnt/d/GitRepo/PyMesh 這個字串

通過 pip 安裝依賴庫:

pip install -r $PYMESH_PATH/python/requirements.txt

嫌慢的話可以試試通過清華大學開源軟體映象站安裝:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r $PYMESH_PATH/python/requirements.txt

2.4. 編譯並安裝 PyMesh 庫

安裝 cmake(不需要自己下載編譯安裝最新的 cmake,官方提供的版本足夠):

sudo apt install cmake

正常流程就是先進入 $PYMESH_PATH,通過目錄下的 setup.py 呼叫 setuptools 編譯第三方庫(原始碼位於$PYMESH_PATH/third-party):

cd $PYMESH_PATH
./setup.py build

可能會遇到如下報錯:

/usr/bin/env: ‘python\r’: No such file or directory

查閱 setup.py,看到第一行就是:

#!/usr/bin/env python

想到 Windows 下的換行符為 "\r\n",而 Unix 下為 "\n",所以是把 "\r" 認成了普通字元。
首先安裝 vim:

sudo apt install vim

用 vim 開啟 setup.py,將換行模式換為 Unix 模式:

vim $PYMESH_PATH/setup.py

輸入冒號,再輸入 set ff=unix,回車
再輸入冒號,輸入 wq 儲存退出

再次查閱 setup.py,發現是編譯第三方庫後再編譯自身:

def run(self):
        self.build_third_party()
        self.build_pymesh()
        build.run(self)

檢查 $PYMESH_PATH/third-party 目錄,發現 build.py 也需要這樣操作。

修改完成後,再次執行的時候 cmake 會提示沒有找到 GMP,類似的報錯如下:

Could NOT find GMP (missing: GMP_LIBRARIES GMP_INCLUDE_DIR)

流程是先編譯第三方庫,然後編譯自己,所以問題是出在第三方庫上。

通過在網路上仔細檢索,發現自己手動下載編譯安裝 GMP 和 MPFR 這兩個庫即可解決。
為什麼還有 MPFR? 當然是安裝了 GMP 之後 build 時報的錯……所以這裡就一起說了。

2.4.1. 下載、編譯並安裝 GMP

以下步驟提煉自官方教程
首先安裝 m4:

sudo apt install m4

官網:https://gmplib.org/
以 GMP 6.2.1,儲存路徑 D:\Downloads 為例,命令如下:

cd /mnt/d/Downloads
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz

下載完成後,解壓,進入目錄:

sudo tar -xvf gmp-6.2.1.tar.xz
cd gmp-6.2.1

配置、編譯、檢查、安裝(預設在 /usr/local/ 目錄下):

sudo ./configure --enable-cxx
make
make check
sudo make install

注意,GMP 庫的標頭檔案(.h)和庫檔案(lib*)預設安裝在 /usr/local/include 和 /usr/local/lib 下。

2.4.2. 下載、編譯並安裝 MPFR

官網:https://www.mpfr.org/mpfr-current/

以 MPFR 4.1.0, 儲存路徑 D:\Downloads 為例,命令如下:

cd /mnt/d/Downloads
wget --no-check-certificate https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.xz

下載完成後,解壓,進入目錄:

sudo tar -xvf mpfr-4.1.0.tar.xz
cd mpfr-4.1.0

下載累計補丁並應用:

wget --no-check-certificate https://www.mpfr.org/mpfr-current/allpatches
sudo patch -N -Z -p1 < allpatches

配置、編譯、檢查、安裝:

sudo ./configure --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib
make
make check
make install

注意,如果更改過 gmp 的安裝路徑,請自行更改 --with-gmp-include 和 --with-gmp-lib 的值。

2.4.3. 編譯 PyMesh 庫

cd $PYMESH_PATH
./setup.py build

這下應該不會報錯了,只不過需要漫長的等待。

2.4.4. 安裝及測試 PyMesh 庫

安裝:

sudo ./setup.py install

測試:

python -c "import pymesh; pymesh.test()"

所有專案都 pass 通過就是正確的。

3. 安裝 vtk 和 PyQt5

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple vtk
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5

4. 配置 PyCharm

PyCharm 可以使用 WSL 中的 Python 直譯器,所以可以實現在 Windows 中使用 Linux 的 Python 環境。
注意:PyCharm 不能是社群版,否則沒有 WSL 選項,需要選擇 SSH;這裡只講解 WSL。

4.1. 配置 Python Interpreter

  1. 開啟專案,進入設定(File -> Settings)

  2. 找到 Project: xxx -> Python Interpreter,看向右邊,點選小齒輪按鈕,點選 Add

  3. 在左側選擇 WSL,選擇正確的 Linux distribution 和 Python interpreter path(比如作者的是 Ubuntu 和 /usr/bin/python),點選 OK

  4. 此時,列表中會顯示子系統中安裝的所有 Python 包,點選 OK

  5. 等待 PyCharm 後臺任務執行完畢即可

4.2. WSL 配置並啟動 SSH

由於使用了 PyQt5,需要將影象傳輸到 Windows 系統中,所以需要 X Server 來實現這一功能。

首先進入 WSL,準備配置 SSH。
注意:本例中的 Ubuntu 20.04 LTS 是自帶 ssh 的,只需要開啟,其他分發版請善用搜索引擎。

修改 ssh 配置檔案:

sudo vim /etc/ssh/sshd_config

修改兩個地方並儲存退出:

Port 22 # 取消註釋即可,如果想改埠就改這個
PasswordAuthentication yes # 取消註釋並改為 yes,允許使用者名稱密碼方式登入

首次啟動服務需要生成金鑰:

cd /etc/ssh
sudo ssh-keygen -A

啟動 ssh 服務:

sudo /etc/init.d/ssh start

執行命令檢視 sshd 服務是否啟動:

ps -e | grep ssh

成功啟動 ssh 服務之後即可在 Windows 中通過 ssh 連線 WSL;
地址為 127.0.0.1 或者 localhost,埠預設為 22

4.3. Windows 通過 SSH 連線 WSL

本例使用 MobaXterm 連線 WSL,下載頁面

  1. 點選 Session 來建立一個新的會話

  2. 點選 SSH,Remote host 寫 localhost,勾選 Specify username,填入你 WSL 中設定的使用者名稱,最後點選 OK

  3. 根據提示輸入 WSL 中的密碼等操作,完成連線。

4.4. WSL 配置 DISPLAY 環境變數

使用 MobaXterm 通過 SSH 連線 WSL,執行下面的命令:

echo "export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0" >> ~/.bashrc
echo "export LIBGL_ALWAYS_INDIRECT=0" >> ~/.bashrc  # required for OpenGL apps like rviz

重新連線 WSL。
可以通過執行一個使用了 X11 的應用程式來測試是否配置正確:

sudo apt install xterm
xterm

如果顯示形如 xterm: Xt error: Can't open display: ... 的報錯,請檢查 X server 是否正確執行,比如 MobaXterm 的右上角就有 X server,將滑鼠指標放上去就能看到狀態。

右鍵 X server,點選 Configuration,將 X11 remote access 修改為 full

4.5. 配置 PyCharm 專案的 Run/Debug Configuration

修改 PyCharm 的 Run/Debug Configurations。

在 Environment variables 這一項後面新增一個環境變數 DISPLAY=172.17.9.161:0
這裡 DISPLAY 的值可以在 MobaXterm 中執行下面的命令獲得:

echo $DISPLAY

或者

export | grep DISPLAY

注意,執行專案時需要同時執行著 MobaXterm 不能關閉。

如果沒有做這一節的配置而直接執行專案,則可能看到如下的報錯資訊:

qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.

Aborted

至此,所有配置全部完成,開始努力寫程式碼吧(悲

5. 疑難雜症(持續發現中)

5.1. PyCharm 中無法自動補全 vtk 相關程式碼

在匯入包的時候需要這麼寫:

import vtkmodules.all as vtk

5.2. PyCharm 提示 "You need a configured local Python SDK to render docstrings."

翻譯:你需要一個配置好的本地 Python SDK 來渲染 Docstrings。

這是沒有配置本地 Python 直譯器的原因,需要將 Windows 中的 Python 直譯器新增到 PyCharm 的 Python 直譯器列表中。

5.3. 設定開機自啟 Ubuntu 的 SSH 服務

需要用到計劃任務,開啟執行指令碼即可。指令碼內容如下(管理員身份):

wsl -d Ubuntu -u root -e /etc/init.d/ssh start

手動開啟的一鍵指令碼:

@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
wsl -d Ubuntu -u root -e /etc/init.d/ssh start
pause

碎碎念:網路上許多提權的程式碼的引號是中文的導致指令碼執行時報錯……