众所周知,虽然Windows和Linux都可以运行Python,但是对很多Python扩展包的支持是不一样的。
比如 深度学习相关的pytorch
比如 自动化运维相关的ansible
小编本人也尝试将Ubuntu作为自己的主系统,并且为了逼自己适应,硬是将自己三台电脑(家里台式、笔记本、公司台式)全部装上了Ubuntu,但是讲真的生态真的是太差了,除了基本告别摸鱼打游戏之外,一些很基本的应用Office和微信虽然也有wine版本或者替代品,但不得不说真的是太别扭了。
有人这里就要很聪明的说一句,可以开虚拟机啊,但是在我的认知里,VMware Workstation等,是做实验、测试、应急的时候用一用没问题,如果作为常规使用,驱动、性能和切换的体验之差,不用多说了。
如果有一个玩意,可以只是在开发调试的时候将其拉起,并且又可以兼备兼容和便捷的东西,那我想那应该就是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,傻傻分不清楚。
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,悄悄告诉我一下体验如何,那样搭建的话可以省下很多需要做目录映射的部署。
用管理员身份打开 PowerShell,或者在管理员身份打开Terminal,打开新的PowerShell选项卡,输入:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
同样在PoweShell中输入下面的命令,输入完命令后,要重启一下电脑,否则第三步的安装包安装不上的。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Linux 内核更新包
同样在PoweShell中输入下面的命令
wsl --set-default-version 2
可以在微软应用商店里搜索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运行,提示风险选择继续之后开始安装,安装完成后有提示。
打开Terminal,新增新选项卡时,有自己安装的Linux发行版的选项,选择该选项能够进入到Linux终端,宣告WSL安装成功。
基本上达到这样的程度可以说明WSL已经OK了。
网上有很多教程就不详细说了,写下执行的命令和注解
# 安装编译相关工具
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
我们以django项目为例进行示范
项目目录起名为csdntestdjango, 选择先前配置的解释器,选择WSL
选择分发版,点击下一步
选择新建, 位置填一个空的路径放置虚拟环境,例如:/venv/csdntestdjango,点击创建
随后点击创建,完成项目创建项目
自动开始启动django安装
主要设置一下数据库链接,确保django初步能够正常运行
默认PYcharm的终端仍然是本地而非wsl,将pycharm的终端设置为bash.exe
WSL终端不会激活虚拟环境,需要手动激活
source /venv/csdntestdjango/bin/activate
激活后,效果
我这里数据库需要使用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"
}
}
}
点击运行,看效果
其中的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控制台设置,添加路径映射
映射的规则大致是F:盘对应/mnt/f,其他路径与windows一致,相当于将windows文件系统挂载到了WSL子系统中(用于运行程序)
确定后重启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])
完成设置后,关闭django控制台,重新打开,完美运行。
这里需要注意一下,需要重新打开控制台,点击重新运行或者ctrl+F5没有任何作用。
如果在创建项目中直接使用WSL解释器,不会存在该问题。
所以我拿另外一个project来复现这个问题。
但是正在开发的项目,解释器原来在windows中,修改为wsl的解释器就会报错
问题原因查了pycharm的官网,有歪果仁也遇到了类似问题,但是没说怎么解决,自己摸索了一个解决方法。
问题其实是,修改为WSL解释器后,路径拼写出了错,导致没有找到site-packages文件夹。
解决方法:
编辑运行\调试解释器配置设置
添加路径映射
将windows的虚拟环境的路径中的site-packages映射到linux虚拟环境的路径中的site-packages,确定后应用。
问题完美解决
WSL配合Pycharm的开发环境,虽然有点小的问题,总体来说体验是不错的。
有朋友可能也体验过远程开发,远程开发对服务器性能、开发终端的性能以及网络传输都有很高的要求,性能开销不小,性能开销主要来源于代码的实时同步。
而WSL的方式是Linux子系统挂载WIndows的文件系统,说白了代码没有拷贝来拷贝去的,自然性能开销就小了。
并且WSL在过程中仅仅作为一个python解释器的角色,Pycharm本身的性能还是依赖于WIndows自然流畅很多(相比在虚拟机Linux中装Pycharm),至少我是这么认为的。那么结尾的时候我们来投票选出你心中最合适的开发环境。
如果你觉得我的文章还不错,确实解决了您的一些问题的话,麻烦点个赞、收藏、加粉丝,如果有什么问题可以在评论区交流,我将及时答复或者做出修正,谢谢!