menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

Visual Studio Code搭配Python虚拟环境

作者:E4b9a6, 创建:2019-09-18, 字数:3552, 已阅:58, 最后更新:2019-09-18

这篇文章更新于 1892 天前,文中部分信息可能失效,请自行甄别无效内容。

1. 背景

使用Python开发项目经常会遇到不同项目使用不同的Python版本

而且这些版本还要用到不少第三方的PYPI的包,这些包又有不同的版本

这样在卸载或者更新一些第三方pip包时,有老项目运行不起来的风险

这个时候,我们就需要使用Pyenv+Venv来为每一个项目独立自己的项目开发环境

以下过程基于Debian10发行版,Ubuntu/Debian发行版通用,只是包名略有不同,对于Redhat发行版可能就不太通用的,许多包需要自行编译

2. 开发环境搭建

2.1. Pyenv

Pyenv用于解决不同项目不同Python版本问题,相较于自行编译安装不同Python版本的好处

  • 安装/卸载方便快捷
  • 集中管理Python版本

使用pyenv时,对于每一个项目,执行入口方法时都是 python3 main.py

而自行编译安装,则需要将安装后的Python软链接至/usr/bin下,在执行项目入口方法时还要区分不同的版本,2个不同项目的启动命令可能会如下

  • python3.6 /srv/demo_01/main.py
  • python3.7 /srv/demo_02/main.py

这样做不利于区分什么项目使用什么版本的解释器,会比较麻烦,而pyenv能很好的解决这个问题

2.1.1. 安装配置

安装pyenv

Bash
➜ sudo apt -y install git gcc libgdbm-dev make patch zlib1g.dev libssl-dev libsqlite3-dev libbz2-dev libreadline-dev
➜ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

在安装完成后,脚本会提示需要添加环境变量,请按照提示操作,下面是例子

Bash
➜ vim ~/.zshrc

# 添加类似于下面的换将变量
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

2.1.2. 使用指南

安装完成之后,根据需要安装Python版本,这里暂且假设需要使用3.7.1

Bash
➜ pyenv install 3.7.1

接着可以使用下面的指令来指定某个项目的Python版本,这里假设要指定项目 /srv/demo 项目

Bash
cd /srv/demo
➜ pyenv local 3.7.1

检查一下当前项目的Python版本

Bash
➜ demo pwd
/srv/demo
➜ python -V
Python 3.7.1

以下是pyenv的常用命令

Bash
# 所有可安装的版本列表
pyenv install -list    

# 下载制定版本的Python
pyenv install 3.6.9

# 查看当前已下载的版本
pyenv versions

# 设置系统的Python版本
pyenv global 3.6.9

# 设置当前目录为某个Python版本
pyenv local 3.6.9

# 更新pyenv
pyenv update

有了Pyenv,我们可以方便的卸载安装多个Python版本,无需手动编译安装,方便快捷

2.2. venv配置

设置好了Python版本,这个时候如果我们使用pip安装第三方包,会发现这些包依旧是安装在用户路径的.local路径下

在实际开发中,我们是希望直接安装在当前项目目录下更好一些

这个时候我们就需要使用venv虚拟环境了

使用指南

可以使用如下指令创建虚拟环境

Bash
➜ python3 -m venv .env

上面这个指令会在当前目录下创建一个.env的文件夹,其中包含了所需的Python虚拟环境以及当前默认的Python版本

紧接着,激活这个Python环境

Bash
source .env/bin/activate

激活成功之后在命令提示符前面会出现 (.env) 的标志,检查一下pip程序的路径

Bash
(.env) ➜ pip -V
pip 21.0.1 from /srv/demo/.env/lib/python3.9/site-packages/pip (python 3.9)

尝试一下安装 requests,然后检查一下 .env/lib/python3.9/site-packages,可以看到requests包位于此处

这样虚拟环境便搭建完成了

在项目开发完毕之后,为了方便协作开发,可以导出项目依赖文件 requirements.txt,不用再麻烦地将第三方引用包写在 README.me文件中

Bash
pip3 freeze > requirements.txt

3. Visual Studio Code配置

3.1. 选择解释器

如上,配置完成后,我们的项目具有了虚拟的配置环境,无论是Python的版本还是pip导入的第三方包均位于当前项目下.env文件夹中

打开Visual Studio Code后,可以点击左侧的DEBUG标志

点击 create a launch json file 创建一个DEBUG的配置文件,选择Python或者具体的项目框架

在项目根目录生成的.vscode/launch.json文件中更改Python解释器

提示:python这个键的值可以指定Python解释器,如下文中的 ${workspaceRoot}/.env/bin/python3

JSON
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Flask",
            "type": "python",
            "request": "launch",
            "module": "flask",
            "port": 5001,
            "host": "0.0.0.0",
            "python": "${workspaceRoot}/.env/bin/python3",
            "env": {
                "FLASK_APP": "${workspaceRoot}/src/main.py",
                "FLASK_ENV": "development",
                "FLASK_DEBUG": "1",
            },
            "args": [
                "run",
                "--no-debugger",
                "--no-reload",
            ],
            "jinja": true
        }
    ]
}

3.2. 安装扩展包

Vscode有非常多好用的第三方扩展插件,基本搜索一下python,star数高的都是非常值得尝试的插件扩展,这里列出常用的几个

  • Python
  • Python for VSCode
  • Python Docstring Formatter
  • Python Docstring Generator
  • Python Extension Pack
  • Python for VSCode
  • Python Indent
  • Python Path
  • Python Preview

4. 结束语

以上搭建结合Visual Studio Code的远程SSH开发,太舒服了


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]