话说 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 依赖管理的方式不说,视频中提到了
- 手工下载包,然后
python requests-threads-0.1.1/setup.py install
的安装方式 easy_install requests-threads
自动从网络上下载并安装到本地,它却未提供卸载的命令easy_install
的替代品pip
出现了,可pip install requests
或pip uninstall requests
。Python3 的相应的命令是pip3
。virtualenv
或python3 -m venv
, 虚拟环境的出现,每个项目自我管理依赖,营造相互隔离的应用环境- 新一代的
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 交互界面下的路径列表:
1 2 3 4 5 6 7 |
['' '/usr/lib/python36.zip' '/usr/lib/python3.6' '/usr/lib/python3.6/lib-dynload' '/home/vagrant/.local/lib/python3.6/site-packages' '/usr/local/lib/python3.6/dist-packages' '/usr/lib/python3/dist-packages'] |
重来没有安装过用户独立的模块的话,第五行可能看不到,说下区别
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
时,无论模块是安装到全局或用户目录中,都有以下弊端
- 不同的 Python 项目基本无法使用同一模块的不同版本
- 容易产生许多垃圾模块,曾经下载的模块不知道是否有谁仍在使用
- 不能简单的用
pip3 freeze
来生成requrements.txt
文件,它将包含一大堆的内容
所以当维护一个项目时,最好在 Python 虚拟环境中使用 pip
, 我们将要使用到 python3 -m venv
或 virtualenv
接下来会学习 Python 虚拟环境的应用(顺带提下 conda, Anaconda 也可用于包管理与环境管理,只是它们专注于科学数据科学与机器学习领域)
[…] Python 包管理及虚拟环境的应用(一: pip) […]
[…] Python 包管理及虚拟环境的应用(一) […]
[…] 这里有一个 Python 包管理工具变迁的视频: Kenneth Reitz - Pipenv: The Future of Python Dependency Management - PyCon 2018。再更早的 Python 依赖管理的方式不说,视频中提到了 阅读全文 >> […]