搭建 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

碎碎念:网络上许多提权的代码的引号是中文的导致脚本运行时报错……

posted @ 2022-04-22 19:38  CRP-Studio  阅读(4468)  评论(0编辑  收藏  举报