Python项目环境管理和依赖管理

Python版本管理

不同的python项目可能依赖不同的python解释器,想要在同一电脑上运行多个项目,就需要安装不同版本的Python。

pyenv是python版本管理工具,可以帮我们非常容易的管理多个版本的python。

本文只关注Mac电脑上的依赖管理。

安装pyenv

安装前的准备

非必须,但是官方强烈推荐的一些python构建依赖:

$ brew install openssl readline sqlite3 xz zlib

安装

使用Homebrew安装pyenv

$ brew install pyenv

安装后的配置

将pyenv init添加到shell中以启用shims和命令自动补全。确保eval "$(pyenv init -)"被放置在shell配置文件的末尾,因为它在初始化过程中操纵路径。

bash

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

zsh

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

之后重启shell以使对PATH环境变量的修改生效

$ exec "$SHELL"

用pyenv安装python

查看当前可安装的python版本

$ pyenv install --list

安装

$ pyenv install 3.8.7

pyenv从python源代码构建python。安装后的python路径在~/.pyenv/versions/

切换python版本

查看当前已安装版本

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

前面带*的为当前active版本

切换版本

可以通过pyenv globalpyenv localpython shell切换Python版本。

  • pyenv global 属于全局切换,切换完成后,在系统中任何地方执行python,你会发现都是同样的Python版本。
$ pyenv gloabl 3.6.8
  • pyenv local 执行后会在当前目录中生成一个.python-version文件。python版本只在当前目录及子目录中生效
$ pyenv local 3.6.8
  • pyenv shell 设置当前shell session的python版本。执行后会给当前shell设置一个PYENV_VERSION环境变量
$ pyenv shell 3.6.8

切换后可执行python -V来检查python版本

用pipenv创建虚拟环境

Pipenv是Python官方推荐的包管理工具, 也是一个虚拟环境管理工具。它综合了 virtualenv , pip 和 pyenv 三者的功能。你可以使用pipenv这一个工具来安装、卸载、跟踪和记录依赖,并创建、使用和组织你的虚拟环境。

安装pipenv

使用Homebrew

brew install pipenv

为项目创建虚拟环境

$ mkdir my_python_project
$ cd my_python_project
$ pipenv --python 3.8.6

这样就为项目初始化了一个Python 3.8.6的虚拟环境,并在项目录下生成一个项目依赖包文件Pipefile。如果系统中没有3.8.6版本的Python,pipenv会调用pyenv来安装对应的Python的版本。

默认地,虚拟环境会创建在~/.local/share/virtualenvs目录里面。我们也可以通过pipenv --venv查看项目的虚拟环境目录。可以通过 pipenv --rm删除虚拟环境。

也可使用 pipenv install 创建虚拟环境
也可以使用pipenv install创建虚拟环境和安装Pipfile中所包含的依赖包, 会自动生成一个保证确定性构建的文件Pipefile.lock。

激活和退出虚拟环境

激活虚拟环境

$ pipenv shell

在这个shell中,所使用的包版本将为当前虚拟环境中的包版本

退出,回到原来的shell session中

$ eixt

其他虚拟环境相关操作

查看当前项目路径

$ pipenv --where

查看当前虚拟环境的路径

$ pipenv --venv

查看当前python的信息

$ pipenv --py

Pipefile和Pipefile.lock

Pipfile

用于指定python应用程序或者库的包需求,包括开发和执行阶段。它应只包含项目的顶层依赖。
使用TOML语法编写。

例如:

[[source]] # 软件包源 (从哪里下载软件包)
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # 运行应用程序时所需要的软件包,及其版本
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # 开发应用程序时所需要的软件包
pylint = "*"
wheel = "*"

[requires] # Python版本
python_version = "3.6"

Pipfile.lock

支持确定性构建。根据Pipfile中存在的软件包来指定应使用的依赖及其子依赖的特定版本,从而避免了自动升级彼此依赖的软件包以及破坏项目依赖树的风险。

除了软件包的版本外,它还包含包的哈希值,以支持更安全的验证。

此文件的语法为JSON。

例如:

{
    "_meta": {
        ...
    },
    "default": {
        "flask": {
            "hashes": [
                "sha256:6c3130c8927109a08225993e4e503de4ac4f2678678ae211b33b519c622a7242",
                "sha256:9dce4b6bfbb5b062181d3f7da8f727ff70c1156cbb4024351eafd426deb5fb88"
            ],
            "version": "==0.12.1"
        },
        "requests": {
            "editable": true,
            "git": "https://github.com/requests/requests.git",
            "ref": "4ea09e49f7d518d365e7c6f7ff6ed9ca70d6ec2e"
        },
        "werkzeug": {
            "hashes": [
                "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b",
                "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c"
            ],
            "version": "==0.14.1"
        }

不推荐手动修改该文件。可以根据当前已安装的包来生成Pipefile.lock文件:

$ pipenv lock

该命令会查找当前的虚拟环境文件夹,根据当前已安装的包版本自动生成Pipefile.lock文件。

用pipenv管理项目依赖包

安装依赖包

例如,使用pipenv安装pytest

$ pipenv install pytest

安装dev dependency(开发应用程序时所需要的依赖)

$ pipenv install pytest --dev

安装Pipfile中的所有依赖

$ pipenv install

如果当前已有requirements.txt文件,会自动识别并转换为Pipfile文件。
也可以从requirements.txt文件中安装依赖

$ pipenv install -r requirements.txt
$ pipenv install -r requirements.txt --dev

注意:

默认情况下,我们都是在requirements.txt文件里指定了安装包的版本信息的,在导入requirements.txt文件时,版本信息也会被自动写Pipfile文件里, 但是这个信息我们一般不需要保存在Pipfile文件里,需要手动更新Pipfile来删除版本信息。

查看当前已安装的依赖包

用图的方式列出当前已安装的依赖包

$ pipenv graph

卸载依赖包

$ pipenv uninstall <package>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,737评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,103评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,710评论 0 326
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,909评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,794评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,557评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,939评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,572评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,852评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,871评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,692评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,490评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,939评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,114评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,409评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,971评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,176评论 2 339

推荐阅读更多精彩内容