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 

你可能感兴趣的:(Python项目环境管理和依赖管理)