一文搞定Windows11+WSL+Pycharm开发环境及避坑

WSL+Pycharm开发环境搭建以及常见问题处理(Windows11)

  • 零. 环境及背景
    • 0.1 为什么需要这样的开发环境
    • 0.2 什么是WSL
    • 0.3 搭建环境
  • 壹. Windows11 搭建WSL
    • 1.1 启动 WSL
    • 1.2 启动虚拟机平台功能:
    • 1.3 下载并安装Linux 内核更新包:
    • 1.4 将WSL2设置为默认版本:
    • 1.5 选择Linux发行版进行安装
    • 1.6 如何判定WSL的发行版安装成功
  • 贰. 子系统中安装Python3环境
  • 叁. Pycharm环境搭建
    • 1、 打开pycharm创建django项目
    • 2、初始化django项目
    • 3、解决python控制台中报错 ModuleNotFoundError: No module named 'xxx'
    • 4、解决pycharm 调试报错 pydev debugger: warning: trying to add breakpoint to file that does not exist:
  • 肆. 总结

零. 环境及背景

0.1 为什么需要这样的开发环境

众所周知,虽然Windows和Linux都可以运行Python,但是对很多Python扩展包的支持是不一样的。
比如 深度学习相关的pytorch
比如 自动化运维相关的ansible
小编本人也尝试将Ubuntu作为自己的主系统,并且为了逼自己适应,硬是将自己三台电脑(家里台式、笔记本、公司台式)全部装上了Ubuntu,但是讲真的生态真的是太差了,除了基本告别摸鱼打游戏之外,一些很基本的应用Office和微信虽然也有wine版本或者替代品,但不得不说真的是太别扭了。
有人这里就要很聪明的说一句,可以开虚拟机啊,但是在我的认知里,VMware Workstation等,是做实验、测试、应急的时候用一用没问题,如果作为常规使用,驱动、性能和切换的体验之差,不用多说了。
如果有一个玩意,可以只是在开发调试的时候将其拉起,并且又可以兼备兼容和便捷的东西,那我想那应该就是WSL了。

0.2 什么是WSL

以下内容来自百度百科

Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。
如果使用Windows 10 2004以上,可以通过WSL 2来窗口化运行桌面应用,也不需要另外安装其他的X 服务器。
2022年9月22日,IT之家消息,微软发布了 Windows 11/10 的 Linux 子系统新预览版,版本号为 0.67.6。  
2022年11月16日,微软 Win11/10 Linux 子系统 WSL 1.0.0 正式版发布。

大概意思就是用户体验可以达到WIndows、Linux,傻傻分不清楚。

0.3 搭建环境

Windows版本信息

版本	Windows 11 专业版
版本	22H2
安装日期	‎2022/‎10/‎13
操作系统版本	22621.819
体验	Windows Feature Experience Pack 1000.22636.1000.0

Pycharm版本

PyCharm 2022.3 (Professional Edition)
Build #PY-223.7571.203, built on November 30, 2022
Licensed to Melody Chaser
订阅有效期至 2023年2月8日。
Runtime version: 17.0.5+1-b653.14 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

Pycharm是装在WIndows上的,我并没有打算在子系统里安装Pycharm,有兴趣的小伙伴可以试试直接在子系统里安装PYcharm,悄悄告诉我一下体验如何,那样搭建的话可以省下很多需要做目录映射的部署。

壹. Windows11 搭建WSL

1.1 启动 WSL

用管理员身份打开 PowerShell,或者在管理员身份打开Terminal,打开新的PowerShell选项卡,输入:

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

1.2 启动虚拟机平台功能:

同样在PoweShell中输入下面的命令,输入完命令后,要重启一下电脑,否则第三步的安装包安装不上的。

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

1.3 下载并安装Linux 内核更新包:

Linux 内核更新包

1.4 将WSL2设置为默认版本:

同样在PoweShell中输入下面的命令

wsl --set-default-version 2

1.5 选择Linux发行版进行安装

可以在微软应用商店里搜索Ubuntu,Kali,SUSE Linux Enterprise Server,Debian,Fedora安装,具体装哪个根据自己需要就好了。安装过程点点就好,不详说。

因为习惯及项目需要,我比较偏爱于CentOS,看了WSL官方文档没瞅见,幸好万能的Github上有这个:

https://github.com/mishamosher/CentOS-WSL

下载了CentOS7的WSL镜像

https://github.com/mishamosher/CentOS-WSL/releases/download/7.9-2111/CentOS7.zip

下载后解压,双击CentOS7.exe运行,提示风险选择继续之后开始安装,安装完成后有提示。

1.6 如何判定WSL的发行版安装成功

打开Terminal,新增新选项卡时,有自己安装的Linux发行版的选项,选择该选项能够进入到Linux终端,宣告WSL安装成功。

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第1张图片

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第2张图片

基本上达到这样的程度可以说明WSL已经OK了。

贰. 子系统中安装Python3环境

网上有很多教程就不详细说了,写下执行的命令和注解

# 安装编译相关工具
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install libffi-devel -y

# 下载python安装包
wget http://npm.taobao.org/mirrors/python/3.9.9/Python-3.9.9.tgz
tar -zxvf  Python-3.9.9.tgz

# 安装gcc
yum install gcc

# 编译安装python
cd Python-3.9.9
./configure --prefix=/usr/local/python3
make && make install

修改/etc/profile

vi /etc/profile

脚本中将以下内容添加至末尾,wq保存

export PATH=/usr/local/python3/bin:$PATH

重载profile,并查看python版本

source /etc/profile
# 进入python3 查看版本
python3 

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第3张图片

叁. Pycharm环境搭建

我们以django项目为例进行示范

1、 打开pycharm创建django项目

项目目录起名为csdntestdjango, 选择先前配置的解释器,选择WSL
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第4张图片
选择分发版,点击下一步
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第5张图片
选择新建, 位置填一个空的路径放置虚拟环境,例如:/venv/csdntestdjango,点击创建
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第6张图片

随后点击创建,完成项目创建项目
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第7张图片
自动开始启动django安装
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第8张图片

2、初始化django项目

主要设置一下数据库链接,确保django初步能够正常运行
默认PYcharm的终端仍然是本地而非wsl,将pycharm的终端设置为bash.exe
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第9张图片
WSL终端不会激活虚拟环境,需要手动激活

source /venv/csdntestdjango/bin/activate

激活后,效果
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第10张图片
我这里数据库需要使用pqsql,并且比较熟悉django3.2,安装对应pip

pip uninstall django
pip install psycopg2-binary==2.9.3
pip install django==3.2.11 

为了方便后续一些问题的演示,我将settings的数据库配置进行json文件外置

settings.py修改

import json

conf = json.load(open("config/config.json", "r", encoding="utf-8"))
DATABASES = conf['database']

创建config文件夹,新建config.json文件

{
  "database": {
    "default": {
      "ENGINE": "django.db.backends.postgresql",
      "NAME": "csdndjangotest",
      "USER": "username",
      "PASSWORD": "password",
      "HOST": "192.168.200.1",
      "PORT": "5432"
    }
  }
}

点击运行,看效果

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第11张图片

3、解决python控制台中报错 ModuleNotFoundError: No module named ‘xxx’

其中的xxx是项目的名称,这里是csdntestdjango
问题现象:

/venv/csdntestdjango/bin/python /mnt/d/Program Files/JetBrains/PyCharm 2022.1.3/plugins/python/helpers/pydev/pydevconsole.py --mode=client --host=127.0.0.1 --port=41977 
import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend(['F:\\localgit\\csdntestdjango', 'D:\\Program Files\\JetBrains\\PyCharm 2022.1.3\\plugins\\python\\helpers\\pycharm', 'D:\\Program Files\\JetBrains\\PyCharm 2022.1.3\\plugins\\python\\helpers\\pydev'])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run("F:/localgit/csdntestdjango")
PyDev console: starting.
Python 3.9.9 (main, Dec  7 2022, 13:29:41) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Django 3.2.11
Traceback (most recent call last):
  File "/mnt/d/Program Files/JetBrains/PyCharm 2022.1.3/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
    coro = func()
  File "", line 6, in <module>
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/conf/__init__.py", line 82, in __getattr__
    self._setup(name)
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/conf/__init__.py", line 69, in _setup
    self._wrapped = Settings(settings_module)
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/conf/__init__.py", line 170, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/opt/python39/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 1030, in _gcd_import
  File "", line 1007, in _find_and_load
  File "", line 972, in _find_and_load_unlocked
  File "", line 228, in _call_with_frames_removed
  File "", line 1030, in _gcd_import
  File "", line 1007, in _find_and_load
  File "", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'csdntestdjango'

聚焦这两行

sys.path.extend(['F:\\localgit\\csdntestdjango', 'D:\\Program Files\\JetBrains\\PyCharm 2022.1.3\\plugins\\python\\helpers\\pycharm', 'D:\\Program Files\\JetBrains\\PyCharm 2022.1.3\\plugins\\python\\helpers\\pydev'])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run("F:/localgit/csdntestdjango")

所有的路径都是Windows的路径,而非Linux路径,而我们的控制台实际上启动在WSL环境中
打开django控制台设置,添加路径映射

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第12张图片
映射的规则大致是F:盘对应/mnt/f,其他路径与windows一致,相当于将windows文件系统挂载到了WSL子系统中(用于运行程序)
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第13张图片
确定后重启python控制台,不再报该错误。但是报了新的错误,这个错误与外置配置文件相关,没有做外置文件配置的可忽略

/venv/csdntestdjango/bin/python /mnt/d/Program Files/JetBrains/PyCharm 2022.1.3/plugins/python/helpers/pydev/pydevconsole.py --mode=client --host=127.0.0.1 --port=44923 
import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend(['/mnt/f/localgit/csdntestdjango', '/mnt/d/Program Files/JetBrains/PyCharm 2022.1.3/plugins/python/helpers/pycharm', '/mnt/d/Program Files/JetBrains/PyCharm 2022.1.3/plugins/python/helpers/pydev'])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run("/mnt/f/localgit/csdntestdjango")
PyDev console: starting.
Python 3.9.9 (main, Dec  7 2022, 13:29:41) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Django 3.2.11
Traceback (most recent call last):
  File "/mnt/d/Program Files/JetBrains/PyCharm 2022.1.3/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
    coro = func()
  File "", line 6, in <module>
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/conf/__init__.py", line 82, in __getattr__
    self._setup(name)
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/conf/__init__.py", line 69, in _setup
    self._wrapped = Settings(settings_module)
  File "/venv/csdntestdjango/lib/python3.9/site-packages/django/conf/__init__.py", line 170, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/opt/python39/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 1030, in _gcd_import
  File "", line 1007, in _find_and_load
  File "", line 986, in _find_and_load_unlocked
  File "", line 680, in _load_unlocked
  File "", line 850, in exec_module
  File "", line 228, in _call_with_frames_removed
  File "/mnt/f/localgit/csdntestdjango/csdntestdjango/settings.py", line 16, in <module>
    conf = json.load(open("config/config.json", "r", encoding="utf-8"))
FileNotFoundError: [Errno 2] No such file or directory: 'config/config.json'

其实这个问题之前我有另一篇帖子已经讲的很清楚了,这里不详细解释。
解决该问题非常简单 只需要在django控制台设置中,正在启动脚本开头添加一句

import os; os.chdir([WORKING_DIR_AND_PYTHON_PATHS][0])

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第14张图片
完成设置后,关闭django控制台,重新打开,完美运行。
这里需要注意一下,需要重新打开控制台,点击重新运行或者ctrl+F5没有任何作用。
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第15张图片

4、解决pycharm 调试报错 pydev debugger: warning: trying to add breakpoint to file that does not exist:

如果在创建项目中直接使用WSL解释器,不会存在该问题。
所以我拿另外一个project来复现这个问题。
但是正在开发的项目,解释器原来在windows中,修改为wsl的解释器就会报错

一文搞定Windows11+WSL+Pycharm开发环境及避坑_第16张图片
问题原因查了pycharm的官网,有歪果仁也遇到了类似问题,但是没说怎么解决,自己摸索了一个解决方法。
问题其实是,修改为WSL解释器后,路径拼写出了错,导致没有找到site-packages文件夹。
解决方法:
编辑运行\调试解释器配置设置
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第17张图片
添加路径映射
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第18张图片

将windows的虚拟环境的路径中的site-packages映射到linux虚拟环境的路径中的site-packages,确定后应用。
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第19张图片
问题完美解决
一文搞定Windows11+WSL+Pycharm开发环境及避坑_第20张图片

肆. 总结

WSL配合Pycharm的开发环境,虽然有点小的问题,总体来说体验是不错的。
有朋友可能也体验过远程开发,远程开发对服务器性能、开发终端的性能以及网络传输都有很高的要求,性能开销不小,性能开销主要来源于代码的实时同步。
而WSL的方式是Linux子系统挂载WIndows的文件系统,说白了代码没有拷贝来拷贝去的,自然性能开销就小了。
并且WSL在过程中仅仅作为一个python解释器的角色,Pycharm本身的性能还是依赖于WIndows自然流畅很多(相比在虚拟机Linux中装Pycharm),至少我是这么认为的。那么结尾的时候我们来投票选出你心中最合适的开发环境。

如果你觉得我的文章还不错,确实解决了您的一些问题的话,麻烦点个赞、收藏、加粉丝,如果有什么问题可以在评论区交流,我将及时答复或者做出修正,谢谢!

你可能感兴趣的:(Linux,避坑指南,python,python,linux,django,virtualenv)