您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python版本冲突?优化​Python开发环境的技巧来了

时间:2019-11-11 09:50:58  来源:  作者:
​Python版本冲突?优化​Python开发环境的技巧来了

图源Unsplash

Python编代码体验极佳,并随着新版本的发布越来越好!对于我而言,Python提供的大量免费函数库、高可读性的程序和新引入的类型注释让我沉迷其中无法自拔。然而,数据科学家特别容易使自己的Jupyter notebook变得庞大而杂乱,或者写出一些难以理解的python文件。此外,当一个项目依赖于同一函数库的不同版本时,常常发生版本冲突。修复以上问题消耗大量时间,还经常导致其他项目出现问题。必须找到避免这类问题的解决方式,为编写代码提供便利。

在本篇文章中我将详细介绍常用的工具与技巧,希望能为读者提供帮助。


Python开发环境

解释器


从使用Python时最重要的解释器开始。你当然可以只下载最喜欢的Python版本,然后把所有内容放在里面。但如果你的程序需要不同版本的Python,或依赖于同一第三方模块的不同版本,并需要在几个程序之间无缝切换时该怎么办?

Pyenv可以解决上述问题。

Pyenv共包含三个工具,笔者将介绍其中两个:pyenv(用于安装python)和pyenv-virtualenv(用于配置全局工具)。

通过下方网址安装pyenv。

curl https://pyenv.run | bash

安装后,向.bashrc(或.zshrc)文件中添加下方代码,使得pyenv可用于设备。

exportPATH="~/.pyenv/bin:$PATH"

eval "$(pyenv init -)"

eval "$(pyenv virtualenv-init -)"

最后,重启设备。现在可以使用pyenv安装几乎所有的python解释器,包括pypy、anaconda。

需要注意的是,pyenv只在电脑上搭建本地python环境。搭建python环境需要多种函数库。在Ubuntu系统的电脑上,必须安装以下函数库以防止运行出现问题。

sudo
apt-get installbuild-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev
zlib1g-dev libssl-dev openssllibgdbm-dev libgdbm-compat-dev liblzma-dev libreadline-dev libncursesw5-devlibffi-dev uuid-dev

现在,要安装python解释器只需要执行以下指令。

pyenv installVERSION_YOU_WOULD_LIKE_TO_INSTALL

可以通过pyenv列出所有可用版本。

pyenv install --list

为了使上述过程更加具体,在此安装python3.7.5并且设置其为默认的全局解释器。

pyenv install 3.7.5

pyenv global 3.7.5

输入Python-version指令,屏幕将显示Python3.7.5。

依赖性关系管理(DependencyManagement)

Python中的依赖性管理是项繁重的工作。有许多工具可以帮助完成这项任务。

我最常使用的工具是Poetry。

Poetry可以帮助你简单地完成如下工作。

· 管理项目依赖关系

· 通过虚拟环境将项目分开

· 轻松构建应用程序与函数库

笔者推荐通过以下方式安装poetry:

curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

另外一种依赖性管理的方式是使用pip和pyenv-virtualenv指令。读者可能会问:为什么不只用pip?因为只用pip可能会在全局环境中安装poetry及其依赖项,这可能是你不需要也不想要的。必要指令如下。

# Create a virtual environmentcalled tools that is based on 3.7.5

pyenv virtualenv 3.7.5 tools

# Install poetry into the tools virtual env

pyenv activate tools

pip install poetry

# Check installed poetry version

poetry --version

# Leave the virtual env

pyenv deactivate

# This does not work yet

poetry --version

# Add your tools virtual env to the globally available ones

pyenv global 3.7.5 tools

# Now this works and you can start using poetry

poetry --version

在使用poetry创建第一个项目之前,建议先对其进行配置,这样就可以在项目目录中的.venv文件夹中创建虚拟环境。当你使用VsCode或Pycharm这类集成开发环境时就会变得非常方便,因为它们可以立即识别并选择正确的解释器。

poetry configsettings.virtualenvs.in-project true

注意,你只需设置一次配置,设置结果将在全局环境保留。

终于完成了使用poetry创建项目的所有准备工作,太棒了!我把这个项目命名为dsexample,我知道这个名字很蠢,但我不想浪费时间去想一个更好的。为了展示如何使用poetry,我添加了一个特定版本的pandas库,以及所有额外需求的fastapi框架

# Initialze a new project

poetry new dsexample

cd dsexample

# Add modules and create virtual environment.

poetry add pandas=0.25 fastapi --extras all

# As an example of how you could add a git module

poetry add tf2-utils --git git@github.com:Shawe82/tf2-utils.git

如果想要查看一个使用了文中推荐工具的实际项目,请前往我的Github仓库。

格式一致性与可读性(Consistent Formatting and Readability)

现在,已经创建好了项目,即将开始添加代码。理想情况下,代码库的格式应该一致,以确保可读性和可理解性。这将是一个非常沉闷乏味的过程,尤其在还有其他人操作代码库时。

但用Black可以解决上述问题!

Black是一种让程序员在编写python代码时能将精力集中于核心内容的工具。它自动为代码添加格式,避免程序员手动添加格式。因为Black的效果非常好,我们把它添加到dsexample中,让它为所有的文件添加格式。

# We add black as a developmentdependency with --dev as we don't

# need it when it comes to production

poetry add --dev black=19.3b0

# Assume we are inside the current toplevel dsexample folder

poetry run black .

很好,现在所有的文件看起来非常整齐了。

类型纠正(Type-Correctness)

自Python3.5开始(如果我记错了请纠正),类型注释开始成为标准库的一部分通过类型注释,代码更好理解,更易维护,不易出错。为什么会不易出错呢?因为可以静态地检查变量和函数的类型是否符合预期。当然,必须是自动完成的。

下面介绍mypy。

Mypy是一种静态python代码检查器,作用是在错误发生之前找到他们。使用poetry向项目中添加mypy并进行代码检查与添加black一样简单。

ypy as a developmentdependency with --dev as we don't

# need it when it comes to production

poetry add --dev mypy

# Assume we are inside the current toplevel dsexample folder

poetry run mypy .

运行mypy也可能导致很多麻烦。当然,可以将其设置为只对你关心的错误发出警告。这可以通过在项目中添加mypy.ini文件实现。

将自动化工具自动化(Automate the Automation)

使用black和mypy,我们不再需要手工为代码添加格式,并且可以避免不必要的错误。但是我们仍需要手动使用这两个工具,这两个工具不是应该也自动化吗?

是的!

Pre-commit可以完成一切。

Pre-commit工具是在代码提交到仓库前执行检查(我默认读者的代码处在git的控制下)。无法通过检查的代码将被拒绝。这样代码仓库就永远不会出现格式不整齐或是未经类型检查的代码,以及任何其他你需要检查错误的代码。

现在来安装pre-commit。

可以使用poetry将其直接安装在项目里,也可以安装在本地机器里。笔者倾向于后者,因为precommit只在本地使用,而不在CI/CD服务器上。相反,black和mypy在CI/CD服务器上运行,因此,将它们添加到项目的dev依赖项是有意义的。笔者建议使用下面方法通过现有的工具虚拟环境安装它

# Install pre-commit into the tools virtual env

pyenv activate tools

pip install pre-commit

# Leave the virtual env

pyenv deactivate

# As we have already added the tool venv, it will work directly

pre-commit --version

要使用pre-commit,首先需要向顶级文件夹中添加一个名为.pre-commit-config.yarm的文件。在该文件里,你需要配置所有应该运行的钩子。在mypy与Black的环境下,文件内容如下所示。

repos:- repo: https://github.com/ambv/black rev: 19.3b0 hooks: - id: black language_version: python3.7- repo: https://github.com/pre-commit/mirrors-mypy rev: v0.740 hooks: - id: mypy

最后,你必须执行以下命令以设置钩子。

# I assume your are in the toplevel folder

pre-commit install

现在,钩子函数(hook)将在每次提交时运行。Black工具的钩子函数不仅会检查格式,还会相应地为文件添加格式。每次添加新的钩子函数时,建议一开始在所有文件中手动运行pre-commit,因为它只能作用于上次提交之后更改过的文件。

pre-commit run --all-files

就这样,对自动化工具的自动化完成了。


总结

有很多工具可以帮助你专注于重要的事情。此处笔者只介绍了其中的几个。当然,还有更多。希望你学到了新的东西后,可以更加专注于代码本身。



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  Tags: Python  点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  Tags: Python  点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  Tags: Python  点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  Tags: Python  点击:(4)  评论:(0)  加入收藏
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Tags: Python  点击:(6)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  Tags: Python  点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  Tags: Python  点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  Tags: Python  点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  Tags: Python  点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  Tags: Python  点击:(5)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  菜鸟学python    Tags:Python4   点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  风度翩翩的Python    Tags:Python   点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条