3

我正在构建一个 requirements.txt 文件,以通过 pip 在我的团队中部署一组 Python 包。我已将软件包本身保存在本地服务器上以最大程度地减少 Internet 下载,因此我在一个文件夹中有一堆轮子和 gz/zip 文件。

示例 test.txt:

packages\networkx-2.3.zip
packages\cx_Oracle-7.1.3-cp37-cp37m-win_amd64.whl
packages\SQLAlchemy-1.3.3.tar.gz

对于 whl 文件,pip 会正确跳过已安装的软件包,但对于 gz/zip 文件,它总是会重新安装它们。

这是我通过 pip 运行 test.txt 文件时得到的结果:

λ pip install -r test.txt
Processing c:\users\xxxx\dev\python deploy\packages\networkx-2.3.zip
Processing c:\users\xxxx\dev\python deploy\packages\sqlalchemy-1.3.3.tar.gz
Requirement already satisfied: cx-Oracle==7.1.3 from file:///C:/Users/xxxx/dev/Python%20deploy/packages/cx_Oracle-7.1.3-cp37-cp37m-win_amd64.whl in c:\users\xxxx\appdata\local\programs\python\python37\lib\site-packages (from -r test.txt (line 2)) (7.1.3)
Requirement already satisfied: decorator>=4.3.0 in c:\users\xxxx\appdata\local\programs\python\python37\lib\site-packages (from networkx==2.3->-r test.txt (line 1)) (4.4.0)
Installing collected packages: networkx, SQLAlchemy
  Found existing installation: networkx 2.3
    Uninstalling networkx-2.3:
      Successfully uninstalled networkx-2.3
  Running setup.py install for networkx ... done
  Found existing installation: SQLAlchemy 1.3.3
    Uninstalling SQLAlchemy-1.3.3:
      Successfully uninstalled SQLAlchemy-1.3.3
  Running setup.py install for SQLAlchemy ... done
Successfully installed SQLAlchemy-1.3.3 networkx-2.3

如何跳过重新安装压缩包?

4

1 回答 1

1

这种行为是预期的,因为pip无法将轮文件哈希与已安装的包进行比较。要么使用依赖规范,find-links而不是直接使用以下文件的路径test.txt

--find-links=packages
networkx==2.3
SQLAlchemy==1.3.3

或将源分布转换为轮子

$ pip wheel -r test.txt --wheel-dir packages

并使用生成的轮子而不是源分布test.txt

packages\networkx-2.3-py2.py3-none-any.whl
packages\SQLAlchemy-1.3.3-cp36-cp36m-win_amd64.whl

这也应该加快安装时间,因为车轮已经预先构建。但是,带有 C 扩展的包(如SQLAlchemy本例中)将生成与平台或 python 无关的轮子,因此SQLAlchemy-1.3.3-cp36-cp36m-win_amd64.whl只能在 64 位 Windows 上为 Python 3.6 安装。如果您的团队成员有不同的工作环境(例如,有些使用 WINdows,有些使用 MacOS 等),您需要为每个环境提供预构建的轮子;在这种情况下,坚持find-links解决方案。

于 2019-05-08T21:54:02.467 回答