requirements.txt 檔案宣告依賴

PrivateRookie發表於2019-07-10

參考: pip install

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 工具可從以以下四種方式安裝依賴:

  1. PyPI 或其他 index 站點
  2. VCS(版本控制系統,如 Git svn)專案 url
  3. 本地專案資料夾
  4. 本地或遠端歸檔檔案

下面來分別說明四種使用方式

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'

完整描述請參考 PEP-440

VCS

pip 支援 Git, Mercurial, Subversion and Bazaar,因為 Git 最常用,所以這裡只描述 pip + Git.

首先需要在執行 pip 命令的機器上安裝 git。其次有兩種安裝方式 editable 和 non-editable

如果使用 --editable-e 以editable 模式安裝,從遠端拉取的檔案位於 <cwd>/src/project(全域性安裝) 或 <venv_path>/src/project(虛擬環境安裝),可以通過 --src 選項來
覆蓋預設值

如果以 non-editable 模式安裝,檔案會被儲存在臨時檔案中並照常安裝,但如果環境中已有滿足依賴的包,拉取下來的包將不會覆蓋原有的包,除非使用 --upgrade

如果使用 vcs, pip 需要通過 egg=<project_name> 來指定包名稱,如

-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 git+git@git.example.com:project#egg=project

另外也可以指定分支、tag 和 commit hash

[-e] git://git.example.com/project.git@master#egg=project
[-e] git://git.example.com/project.git@v1.0#egg=project
[-e] git://git.example.com/project.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=project

如果使用 commit hash 建議使用完整 hash 這樣可以減少 git api 呼叫次數

本地檔案或歸檔檔案

這兩者都比較簡單,看例子即可,歸檔檔案可以是 tar.gz 或者是 wheel 檔案

# 本地檔案
[-e] <local_project_path>

# 本地 tar.gz
<path_to_tar.gz>
file:///<absolute_path_to_tar.gz>

# 遠端 tar.gz
http[s]://<url_to_tar.gz>

知乎專欄: requirements.txt 檔案宣告依賴 - PrivateRookie的文章 - 知乎

Github 部落格:requirements.txt 檔案宣告依賴

本作品採用《CC 協議》,轉載必須註明作者和本文連結

多少事,從來急。天地轉,光陰迫。

相關文章