參考: https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format
requirements.txt 文件用於聲明 Python 依賴,平常所見的格式非常簡單:
nose
nose-cov
beautifulsoup4
如果是通過 pip freeze 生成,還會指定版本,如
mccabe==0.4.0
netaddr==0.7.19
networkx==2.2
pathlib2==2.3.2
pbr==5.2.0
pep8==1.7.1
pip 會從 PyPI 、配置文件中聲明的 index-url 或通過命令行傳入的 --index 等 index 站點安裝這些包,但根據 pip 文檔描述,pip 工具可從以以下四種方式安裝依賴:
- PyPI 或其他 index 站點
- VCS(版本控制系統,如 Git svn)項目 url
- 本地項目文件夾
- 本地或遠程歸檔文件
下面來分別說明四種使用方式
PyPI
這種方式最為簡單,不做贅述,僅給出常用例子
# 指定一個版本
project == 1.3
# 指定版本區間
project >=1.2,<2.0
# 不使用某個版本
project~=1.4.2
# 6.0 以後的特性,可以指定環境
# Python 版本小於 2.7 時安裝 5.4 版本
project == 5.4; python_version < '2.7'
# 僅在 Windows 環境下安裝
project; sys_platform == 'win32'
完整描述請參考 https://www.python.org/dev/peps/pep-0440/#version-specifiers
VCS
pip 支持 Git, Mercurial, Subversion and Bazaar,因為 Git 最常用,所以這裡只描述 pip + Git.
首先需要在運行 pip 命令的機器上安裝 git。其次有兩種安裝方式 https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs 和 non-editable
如果使用 --editable 或 -e 以editable 模式安裝,從遠端拉取的文件位於 /src/project (全局安裝) 或 /src/project (虛擬環境安裝),可以通過 --src 選項來覆蓋默認值
如果以 non-editable 模式安裝,文件會被保存在臨時文件中並照常安裝,但如果環境中已有滿足依賴的包,拉取下來的包將不會覆蓋原有的包,除非使用 --upgrade
如果使用 vcs, pip 需要通過 egg= 來指定包名稱,如
-e git://git.exmaple.com/project#egg=my_project
如果項目的 setpy.py 文件不在根目錄下,如下面的項目結構
pkg_dir/
setup.py # setup.py for package pkg
some_module.py
other_dir/
some_file
some_other_file
還需要指定 subdirectory
-e git://repo_url/#egg=pkg&subdirectory=pkg_dir
除了 git 協議,pip 還支持以下傳輸協議
git git+http git+https git+ssh git+git git+file
[-e] git://git.example.com/project#egg=project
[-e] git+http://git.example.com/project#egg=project
[-e] git+https://git.example.com/project#egg=project
[-e] git+ssh://git.example.com/project#egg=project
[-e] git+git://git.example.com/project#egg=project
[-e] git+file:///home/user/projects/project#egg=project
-e [email protected]:project#egg=project
另外也可以指定分支、tag 和 commit hash
[-e] git://git.example.com/project.git@master#egg=project
[-e] git://git.example.com/[email protected]#egg=project
[-e] git://git.example.com/project.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=project
如果使用 commit hash 建議使用完整 hash 這樣可以減少 git api 調用次數
本地文件或歸檔文件
這兩者都比較簡單,看例子即可,歸檔文件可以是 tar.gz 或者是 wheel 文件
# 本地文件
[-e]
# 本地 tar.gz
file:///
# 遠程 tar.gz
http[s]://
wheel 文件用法相同
閱讀更多 PrivateRookie 的文章