Python 虚拟环境方案比较

最近在写一个网站后台,由于涉及到阿里云的 SDK ,而阿里云在自己的源(https://mirrors.aliyun.com)上发布的 SDK 要新,因此在设置 Python 的包管理的时候需要注意很多东西。

同时由于历史遗留问题,flask 使用 pipreqs 生成的 requirements.txt 实际上有很多包都不全。在涉及包相对较少的时候还可以使用自定义的 additional reqs 来设置,但是这样子不是很优雅。因此仔细比较了一下常见的 python 虚拟环境方案。

1.Pip

首先要讲讲 pip。Pip 是 python 的包管理工具。 Pip 被用来安装各种包,比如 tensorflow、numpy、pandas 和 jupyter,同时还会自动初一的依赖。

pip install your_favorite_library

许许多多的 Python 资源都通过 pip 包的形式来传输。有时你会在某个包含 Python 脚本的目录下看到一个 requirement.txt 文件。通常,那个文件描述了当前项目所需的所有 pip 包,通过下面的命令即可将它们都安装到当前目录。

 pip install -r requirements.txt. 

作为整个 pip 包生态的一份子,各种各样的版本号、以来信息充斥其中。有时我会针对不同项目使用不同版本的库(pip 包),所以我需要有一种能够针对独立环境配置一组包依赖关系的方式。

2.pipenv

最近非常火的 pipenv,它能通过自己的包管理实现版本跟踪,拥有自己的配置文件,每个包都有自己的哈希。

实际使用的时候发现 pipenv 十分慢,尤其是在gitlab ci 构建容器的过程中,原来 1 min可以完成的构建现在可能需要 5 min 左右,而且官方文档很稀少,很多实现需要看源码。

如果不需要频繁测试或者部署的应用 pipenv 应该是一个不错的选择,以下是 pipenv 的一些主要用法。

pipenv 会生成两个文件:PipfilePipfile.lock

Pipfile

cat Pipfile

[[source]]

url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
name = "pypi"


[packages]

requests = "*"


[dev-packages]



[requires]

python_version = "3.6"

Pipfile.lock

cat Pipfile.lock 

{
    "_meta": {
        "hash": {
            "sha256": "a0e63f8a0d1e3df046dc19b3ffbaaedfa151afc12af5a5b960ae7393952f8679"
        },
        "host-environment-markers": {
            "implementation_name": "cpython",
            "implementation_version": "3.6.1",
            "os_name": "posix",
            "platform_machine": "x86_64",
            "platform_python_implementation": "CPython",
            "platform_release": "17.4.0",
            "platform_system": "Darwin",
            "platform_version": "Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64",
            "python_full_version": "3.6.1",
            "python_version": "3.6",
            "sys_platform": "darwin"
        },
        "pipfile-spec": 6,
        "requires": {},
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "certifi": {
            "hashes": [
                "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296",
                "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d"
            ],
            "version": "==2018.1.18"
        },
        "chardet": {
            "hashes": [
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691",
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
            ],
            "version": "==3.0.4"
        },
        "idna": {
            "hashes": [
                "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4",
                "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"
            ],
            "version": "==2.6"
        },
        "requests": {
            "hashes": [
                "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
                "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
            ],
            "version": "==2.18.4"
        },
        "urllib3": {
            "hashes": [
                "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
                "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
            ],
            "version": "==1.22"
        }
    },
    "develop": {}
}

启动 python3 的虚拟环境

pipenv --three

Creating a virtualenv for this project…
Using /Library/Frameworks/Python.framework/Versions/3.6/bin/python3 to create virtualenv…
⠋Running virtualenv with interpreter /Library/Frameworks/Python.framework/Versions/3.6/bin/python3
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/fredliang/.local/share/virtualenvs/fmt-cPFwS9Ia/bin/python3
Also creating executable in /Users/fredliang/.local/share/virtualenvs/fmt-cPFwS9Ia/bin/python
Installing setuptools, pip, wheel...done.

初始化(部署)python 包管理(生成相关配置文件)

pipenv install

通过 Pipfile 部署环境到系统(根据自动生成的相关配置文件)

pipenv install --deploy --system

安装 requests 库

pipenv install requests

删除 requests 库

pipenv uninstall requests

进入虚拟环境的 shell

pipenv shell

直接在虚拟环境执行 shell

pipenv shell run python runserver.py

列出包依赖关系

pipenv graph
requests==2.18.4
  - certifi [required: >=2017.4.17, installed: 2017.7.27.1]
  - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  - idna [required: >=2.5,<2.7, installed: 2.6]
  - urllib3 [required: <1.23,>=1.21.1, installed: 1.22]

生成锁文件

$ pipenv lock
Assuring all dependencies from Pipfile are installed...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Note: your project now has only default [packages] installed.
To install [dev-packages], run: $ pipenv install --dev

3.Virtualenv

Virtualenv 支持你创建可命名的“虚拟开发环境”,在其中你就能按照单独的习惯安装 pip 包了。 如果你想要针对每个环境独立控制对各类 pip 包的管理,那么这就是一款绝佳的工具比如,你可以为 Web 开发创建独立的环境,定义所需的依赖库,然后为数据相关的开发研究建立截然不同的环境。 这样一来,你再也不用顾虑各种毫无关系的依赖包在开发环境中存在,也可以创建具有专门用途的开发环境。

初始化

virtualenv ENV

source进入该环境

source venv/bin/activate

在虚拟环境安装包

pip install jinja2

退出当前的venv环境,使用deactivate命令:

deactivate 

4.pyenv

Python 多版本共存的方案,类似 nvm 实际上并不能作为一个很好的虚拟环境方案,简单写一下相关的操作。

查看可安装 Python 版本

pyenv install --list

安装相应版本

pyenv install Python 的版本

全局 Python 版本

pyenv global 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

Gradle 命令行黑魔法

#ThoughtWorkers好声音# 第十五期 关于 Gradle ,我们常常会想到的是如何编写一个 Task ,怎么写一个 Plugin ,但是对于 Gr...

27750
来自专栏java思维导图

一文理解Netty模型架构

本文基于Netty4.1展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给读者提供学习实践参考。

13640
来自专栏Flutter入门到实战

开发工具总结(2)之全面总结Android Studio2.X的填坑指南

前言:好多 Android 开发者都在说Android Studio太坑了,老是出错,导致开发进度变慢,出错了又不知道怎么办,网上去查各种解决方案五花八门,有些...

19010
来自专栏battcn

一起来学SpringBoot | 第二篇:SpringBoot配置详解

上一篇介绍了 SpringBoot 由来及构建方式,通过第一章的教程我们对 SpringBoot 不在感到陌生,可以发现 SpringBoot 虽然干掉了 XM...

13010
来自专栏杨建荣的学习笔记

Linux中的configure,make,make install到底在做些什么

在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。 有时...

36230
来自专栏青玉伏案

iOS开发之使用XMPPFramework实现即时通信(一)

关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让我们的微信可以实现互...

218100
来自专栏猿天地

公司ES升级带来的坑怎么填?

公司的ES最近需要全部进行升级,目的是方便维护和统一管理。以前的版本不统一,这次准备统一升级到一个固定的版本。

14430
来自专栏晓晨的专栏

使用 JMeter 进行压力测试

41720
来自专栏小怪聊职场

Java|Spring+SpringMVC+MyBatis框架科普

27550
来自专栏C/C++基础

C++实现简易log日志系统

在软件开发周期中,不管是前台还是后台,系统一般会采用一个持久化的日志系统来记录运行情况。

69020

扫码关注云+社区

领取腾讯云代金券