一文读懂 Python 开发环境配置
Python 多版本管理
1. 多版本使用需求
场景1:如果我们想在python3上运行2.x版本的代码,就需要对代码进行大量的修改,产生不必要的工作量。
2. Windows 下多版本管理[1]
步骤 1:官网 (速度慢)或者国内镜像(速度快)下载Python 对应版本;
步骤 2: 点击可执行文件安装 Python,注意选择“Add python.exe to Path”;
步骤 3: 查看当前电脑下有哪些 Python 版本和安装位置;
方法1 :打开 CMD,输入 where python 查询
> where python
C:\Users\***\AppData\Local\Programs\Python\Python39\python.exe
C:\Users\***\AppData\Local\Programs\Python\Python37\python.exe
> python --version # 查看默认版本 或者python -V
Python 3.9.4
方法2: python 快捷方式右键打开 “打开文件位置” 找到 Python 的安装位置;
步骤 4 : 打开任意版本的 Python,并执行脚本命令;
方法1: 调用参数打开对应版本。首先要将目标版本的 Python 路径添加到环境变量中,
> py -3.9 # 快速启动 python 3.9
> py -3.7 # 快速启动 python 3.7
> py -3.9 -V # 查看详细版本
> py -3.7 helloworld.py # 打开 python 2 脚本
方法2:复制一份重命名为python39.exe,就可以以默认方式直接打开对应版本。
步骤 5 : 多版本共存对应版本的 pip 管理;
(通过切换软件源,可以加快 pip 下载速度,pip 软件源管理(一次性解决下载缓慢问题)有讲解)
# 多版本共存查看 pip 版本
> python -m pip -V / pip -V # 查看默认 pip 版本
pip 21.1.1 from C:\Users\***\AppData\Local\Programs\Python\Python39\lib\site-packages\pip (python 3.9)
> py -3.7 -m pip -V
pip 20.1.1 from C:\Users\***\AppData\Local\Programs\Python\Python37\lib\site-packages\pip (python 3.7)
# 卸载pip
> python -m pip uninstall pip setuptools
# 多版本共存升级pip
> python -m pip install --upgrade pip
> py -3.7 -m pip install --upgrade pip # python 3.7 的pip更新
若更新好,重新运行命令,发现
Requirement already satisfied: pip in c:\users\octob\appdata\local\programs\python\python37\lib\site-packages (21.1.1)
# 多版本共存如何 pip 安装
> pip install requests # 默认 python 关联的 pip 命令安装,安装在python3.9(默认)下
> py -3.7 -m pip install requests # python3.7 关联 pip 命令安装,安装在python3.7下
> python -m pip list # 查看 list ,安装在C:\Users\***\AppData\Local\Programs\Python\Python39\Lib\site-packages
> python -m pip list --outdated # 检查哪些包需要更新
3. Linux 系统下多版本管理[2] - 建立一个对照表
步骤 1: 查看 Linux 默认安装的 Python 位置
$ whereis python # 多版本 python 安装位置
$ which python # 默认 python 的位置
$ ls -l /usr/bin/python* # 软链接
步骤 2: 安装目标版本 Python
$ wget http://python.org/ftp/python/2.7/Python-2.7.tar.bz2
$ tar -zxvf Python-3.6.5.tgz
$ yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel $ readline-devel tk-devel gcc make
# 编译安装(进入 Python-3.6.5 目录)
$ ./configure --prefix=/root/training/Python-3.6.5
$ make && make install
步骤 3: 多版本 Python 管理
$ sudo rm /usr/bin/python
$ python
~bash: /usr/bin/python: No such file or directory # 删除后没有对应
$ ln -s /usr/bin/python2.7 /usr/bin/python # 建立软链接
$ # 建立目标对应链接
$ python
$ python3
步骤 4: 多版本 Pip 管理
- 创建软链接;
- 配置环境变量
# 安装pip前需要前置安装setuptools
$ wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
$ tar -zxvf setuptools-19.6.tar.gz
$ cd setuptools-19.6
$ sudo python3 setup.py build
$ sudo python3 setup.py install
# 安装pip
$ wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
$ tar -zxvf pip-8.0.2.tar.gz
$ cd pip-8.0.2
$ sudo python3 setup.py build
$ sudo python3 setup.py install
# 检查
$ pip -V
# 不同版本 pip 下载包
$ pip install numpy
$ pip3 install numpy
# 配置环境变量(直接使用pip,easy——install, 制订pip安装路径)
$ vi ~/.bash_profile
export PYTHON_HOME=/root/training/Python-3.6.5
export PATH=$PYTHON_HOME/bin:$PATH
保存退出(:wq)
$ source ~/.bash_profile
$ echo $PYTHON_HOME
Python 虚拟环境配置
1. 原理和配置需求
虚拟环境并不是什么新技术,主要是利用了操作系统中环境变量以及进程间环境隔离的特性
操作系统的环境变量
可以为程序提供信息和做信息交换介质,进程可以共享操作系统中的环境变量,也可以为进程指定环境变量,其中 PATH 是很重要的环境变量,用于为操作系统和程序提供可执行文件的访问路径,例如写一个程序 a.exe,存放在 D:\MyProgram 中,在命令行中执行 a.exe ,会得到提示“ 无法找到程序 a.exe”,为了让系统找到,可以将 D:\MyProgram 路径加入到 PATH 环境变量中,当输入 a.exe 时,操作系统就会从 PATH 所提供的路径中逐个查找,这时就可以找到了。Linux 和 MacOS 具有相似的特性,甚至比 Windows 的功能更丰富。
虚拟环境运行和 PATH 修改
Python 虚拟环境就是利用这个特性构建的,在激活虚拟环境之时,激活脚本会将当前命令行程序的 PATH 修改为虚拟环境的,这样执行命令就会在被修改的 PATH 中查找,从而避免了原本 PATH 可以找到的命令,从而实现了 Python 环境的隔离。
Python 解释器和虚拟环境关系
- 一个操作系统下,可以有多个
“操作系统级别的” Python解释器
; - 每个Python解释器有一个指向自己的pip工具,两者
一一对应
; - 通过virtualenv可以虚拟任何一个“操作系统级别的”Python解释器成为一个“虚拟级别”的解释器;
- 每个“虚拟级别”的解释器又拥有自己独立的
pip工具和site-packages
。
2. 安装 & 配置
使用 Virtualenv 管理[3]
要点:
- python3.3 之前,只能通过 virtualenv 创建虚拟环境
- virtualenv 可以指定 python解析器版本,但必须是在本地已安装。
> pip install virtualenv # 默认 Python 位置安装 virtualenv
> virtualenv --no-site-packages myvenv # 创建在当前目录
--no-site-packages: 复制主环境中安装的第三方包
-p: 用于指定 Python 解析器,就是安装好的 Python 应用程序,默认为当前环境中的 Python
–no-pip:不需要安装 pip,默认为安装
–clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建
使用 venv 管理
要点:
- 因为 venv 是依附于一个 Python 解析器创建的,所以不需要指定 Python 解释器版本
- python 3.3 以后版本,可以通过自带模块 venv 创建虚拟环境
> python -m venv myvenv
–without-pip: 不需要安装 pip,默认为安装
–clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建
使用 pipenv 管理
pipenv是Python官方推荐的包管理工具。 它综合了 virtualenv , pip 和 pyenv 三者的功能。能够自动为项目创建和管理虚拟环境。 pipenv使用 Pipfile 和 Pipfile.lock 来管理依赖包,并且在使用pipenv添加或删除包时,自动维护 Pipfile 文件,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息,避免构建错误。相比pip需要手动维护requirements.txt 中的安装包和版本,具有很大的进步。详细使用方法,可参考这篇文章[4][5]。
# 下载
$ pip install pipenv
# 创建环境并安装
$ cd myproject
$ pipenv install # 创建环境
$ pipenv install requests # 或者直接安装库
# 如果不存在pipfile,会生成一个pipfile,并且如果有的库添加会自动编辑该文件,不会我们手动更新requirements.txt文件了。
# 激活
$ pipenv shell
$ python --version
Anaconda 虚拟环境管理
conda可以直接创建不同python版本的虚拟环境。前面讲的virtualenv只是指定创建不同python版本的虚拟环境,前提是你的电脑上已经安装了不同版本的python,与conda相比没有conda灵活。
# 查看 Python 环境
conda info --env
# 创建一个python3.5的环境,我们把它命名为python35
conda create --name python35 python=3.5 # 安装
conda create --name python35 python=3.5 # numpy scipy #创建环境并安装包
conda create --name python37 --clone python37 # 克隆方式闯将环境
# 激活环境并在环境中安装必要包( mac/linux 系统中需命令首加上 source)
conda activate python35 # 物理路径在D:\Anaconda\envs
conda deactivate python35
conda/pip install numpy
# 迁移环境
conda list --explictit > bio-env.txt
conda env export > py36.yaml
conda env create -f py36.yaml # conda 安装的
pip freeze > requirements.txt
pip install -r requirements.txt # pip 安装的
pip install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 删除 python35
conda remove -n python35 --all
# help
conda --help
详细命令见conda Cheet Sheet
3. 激活 & 退出
通过 virtualenv 和 模块 venv 创建的虚拟环境,激活方式是一样的,即运行激活脚本
- Windows 系统中,激活脚本路径是
<myvenv>\Scripts\activate.bat
,如果是 powershell 命令行,脚本换成Activate.ps1
, 注意将<myvenv>
换成你自己的虚拟环境目录 - Linux 系统中,激活脚本路径是
<myvenv>/bin/activate
,默认脚本没有执行权限,要么设置脚本为可执行,要么用source
命令执行,例如source myvenv/bin/activate
检验是否已激活
$ echo $PATH # linux 下
> echo %PATH% # window 下
退出虚拟环境很简单,只需要执行 deactivate
命令就行
linux:
$ deactivate
Windows 10:
> .\Scripts\deactivate.bat
4. 与开发工具配合
Visual Studio Code
按下 Ctrl+Shift+P, 在弹出的命令窗口中输入 “解析器”,然后在下拉列表中选择 “Python:选择解析器”,这里会缓存一些已经创建好的解析器,如果没有想要的,可以选择 “Enter interpreter path” 来选择解析器路径,即已经创建好的虚拟环境脚本文件夹中的 Python 程序,就可以创建一个新的解析器。
Pycharm
创建项目时,在项目创建对话框中,可以创建或者选择已经已有的解析器
4. 开发环境快速部署
此部分拷贝自Python 虚拟环境 看这一篇就够了
之所以在开发时选择虚拟环境,除了避免库之间的冲突,还有重要的原因时方便部署,因为虚拟环境时独立的,仅包含了项目相关的依赖库,所以部署的效率更高,风险更小
一般部署流程是:
- 开发完成后,使用
pip freeze > requirements.txt
命令将项目的库依赖导出,作为代码的一部分 - 将代码上传到服务器
- 在服务器上创建一个虚拟环境
- 激活虚拟环境,执行
pip install -r requirements.txt
,安装项目依赖
怎么运行项目,需要看项目的具体情况
- Web 项目 Web 项目一般使用 Django、Flask 的 Web 开发的提供 Web 服务的项目,部署时需要一个 Web 容器,作为程序的运行环境,容器的配置中都有一个虚拟环境的设置,其实是指定 Python 解析器的路径,将其设置为虚拟环境的目录或者 Python 解析器就可以了,启动时就用使用虚拟环境,并与其他环境隔离。例如 uWSGI 配置文件中 home 参数是用来指定解析器的。
- 服务类项目 服务类项目就是需要以服务的形式长时间运行的,例如之前介绍的 公交闹钟,或者一些定时爬虫之类的,对于 Linux 而言,当前主流的服务方式是 Systemd,是一种比 init 更先进的服务管理工具,在服务脚本中, 设置 ExecStart 执行命令为全路径的虚拟环境的 Python 解析器,服务启动时,使用独立的虚拟环境了。 Windows 服务,对于达成 EXE 包的,不需要配置虚拟环境,因为打包时已经考虑了环境问题了,如果时脚本运行的话,需要指定全路径的 Python 解析器
- 单次运行项目 对于一些测试或者实验性质的项目,大多数情况下手动执行,只要在激活的虚拟环境下,或者用特定的 Python 解析器运行就好了,和在开发过程中运行区别不大
VS Code开发环境常见问题
同级目录模块调用
在 comb_analyser.py 下 想调用 config 下配置文件。
方法1:在 comb_analyser.py 中添加 如下片段
import sys,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # __file__获取执行文件相对路径,整行为取上一级的上一级目录
sys.path.append(BASE_DIR)
方法2:在setting.json中添加自动寻找路径(此方法测试不成功)
"python.autoComplete.extraPaths": [
"e:/engine-fault-diagnosis-signal_processing",
"e:/engine-fault-diagnosis-signal_processing/config"
]