Python 包管理及虚拟环境的应用(一)

话说 Python 的哲学之一就是: 用一种方法,最好是只有一种方法来做一件事。可以用 python -m this 或在  python 交互界面下 import this 看到 The Zen of Python 有一句:

There should be one-- and preferably only one --obvious way to do it.

然而 Python 在关于包管理(依赖管理)一事上却让人面临了众多的选择。

即使是 Java 日趋发展庞大的今天,包管理工具也没有如今的 Python 复杂,Java 的包管理工具经历了手工下载 jar 包,Maven, Ant+Ivy, Gradle, sbt, 但主流的也就 Maven 和 Gradle, 并且它们兼具项目构建的功能。

这里有一个 Python 包管理工具变迁的视频: Kenneth Reitz - Pipenv: The Future of Python Dependency Management - PyCon 2018。再更早的 Python 依赖管理的方式不说,视频中提到了

  1. 手工下载包,然后 python requests-threads-0.1.1/setup.py install 的安装方式
  2. easy_install requests-threads 自动从网络上下载并安装到本地,它却未提供卸载的命令
  3. easy_install 的替代品 pip 出现了,可 pip install requests 或 pip uninstall requests。Python3 的相应的命令是  pip3
  4. virtualenv 或 python3 -m venv, 虚拟环境的出现,每个项目自我管理依赖,营造相互隔离的应用环境
  5. 新一代的 pipevn,依赖描述文件是 Pipfile, 并支持锁定文件,区分开发与产品环境

下面体验一下 pip(将以 pip3 为例), venv 和 virtualenv, 以及 pyvenv 的应用。系统环境是 Ubuntu 18.04 + Python 3.6.7,当前用户是 vagrant

1. pip3 依赖管理

首先 pip3 没有的话需要通过下面的命令进行安装

sudo apt-get install python3-pip

pip 安装的模块可以是全局的或用户独立的,回忆一下 Python 的模块搜索路径,安装后模块总是要能被 Python 程序搜索到才有用,Python 搜索模块的路径是依照 sys.path 的列表值顺序。我们用 python3 -c "import sys; print(str(sys.path).replace(',', '\n'))" 查看 Python3 交互界面下的路径列表:

重来没有安装过用户独立的模块的话,第五行可能看不到,说下区别

sudo pip3 install requests

使用了 sudo , 但没有带  --user 参数情况下 pip 安装模块到全局路径中,即 requests 及其依赖将被安装到 /usr/local/lib/python3.6/dist-packages 目录中,对任何用户可见。

pip3 install requests
或 pip3 install requests --user
或 sudo pip3 install requests --user

未用 sudo 或指定了 --user 参数,模块 requests 及其依赖将被安装到当前用户目录 /home/vagrant/.local/lib/python3.6/site-packages 中,对其他用户不可见。

相的模块先安装到全局目录 /usr/local/lib/python3.6/dist-packages 中,然而再次安装到用户目录 /home/vagrant/.local/lib/python3.6/site-packages, 反过来就不允许。

在没有虚拟环境下使用 pip 时,无论模块是安装到全局或用户目录中,都有以下弊端

  1. 不同的 Python 项目基本无法使用同一模块的不同版本
  2. 容易产生许多垃圾模块,曾经下载的模块不知道是否有谁仍在使用
  3. 不能简单的用 pip3 freeze 来生成  requrements.txt 文件,它将包含一大堆的内容

所以当维护一个项目时,最好在 Python 虚拟环境中使用 pip, 我们将要使用到 python3 -m venv 或 virtualenv

接下来会学习 Python 虚拟环境的应用(顺带提下  conda, Anaconda 也可用于包管理与环境管理,只是它们专注于科学数据科学与机器学习领域)

类别: Python. 标签: , , , . 阅读(16). 订阅评论. TrackBack.

Leave a Reply

avatar
trackback

[…] 这里有一个 Python 包管理工具变迁的视频: Kenneth Reitz - Pipenv: The Future of Python Dependency Management - PyCon 2018。再更早的 Python 依赖管理的方式不说,视频中提到了 阅读全文 >> […]