首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pip:将依赖项下载到特定平台,包括非二进制文件

pip:将依赖项下载到特定平台,包括非二进制文件
EN

Stack Overflow用户
提问于 2017-09-19 03:47:32
回答 4查看 3.2K关注 0票数 17

我正在尝试从linux主机下载paramiko的依赖项到不能访问互联网的windows目标上。

在阅读了pip's documentation上的示例后,我已经习惯了以下命令,以便将依赖项递归下载到64位windows平台:

代码语言:javascript
运行
复制
pip3 download --only-binary=:all: --platform win_amd64 --implementation cp paramiko

能够递归地下载依赖项,直到到达pycparser。这并不奇怪,因为我使用了--only-binary=:all:标志。问题是- pip在传递--platform标志时强制使用此标志:

代码语言:javascript
运行
复制
ERROR: --only-binary=:all: must be set and --no-binary must not be set (or must be set to :none:) when restricting platform and interpreter constraints using --python-version, --platform, --abi, or --implementation.

终端产生了以下输出:

代码语言:javascript
运行
复制
Collecting paramiko
  Downloading paramiko-2.3.0-py2.py3-none-any.whl (182kB)
    100% |████████████████████████████████| 184kB 340kB/s 
  Saved ./paramiko-2.3.0-py2.py3-none-any.whl
Collecting pynacl>=1.0.1 (from paramiko)
  Using cached PyNaCl-1.1.2-cp35-cp35m-win_amd64.whl
  Saved ./PyNaCl-1.1.2-cp35-cp35m-win_amd64.whl
Collecting cryptography>=1.5 (from paramiko)
  Using cached cryptography-2.0.3-cp35-cp35m-win_amd64.whl
  Saved ./cryptography-2.0.3-cp35-cp35m-win_amd64.whl
Collecting pyasn1>=0.1.7 (from paramiko)
  Using cached pyasn1-0.3.5-py2.py3-none-any.whl
  Saved ./pyasn1-0.3.5-py2.py3-none-any.whl
Collecting bcrypt>=3.1.3 (from paramiko)
  Using cached bcrypt-3.1.3-cp35-cp35m-win_amd64.whl
  Saved ./bcrypt-3.1.3-cp35-cp35m-win_amd64.whl
Collecting cffi>=1.4.1 (from pynacl>=1.0.1->paramiko)
  Using cached cffi-1.11.0-cp35-cp35m-win_amd64.whl
  Saved ./cffi-1.11.0-cp35-cp35m-win_amd64.whl
Collecting six (from pynacl>=1.0.1->paramiko)
  Using cached six-1.11.0-py2.py3-none-any.whl
  Saved ./six-1.11.0-py2.py3-none-any.whl
Collecting asn1crypto>=0.21.0 (from cryptography>=1.5->paramiko)
  Using cached asn1crypto-0.22.0-py2.py3-none-any.whl
  Saved ./asn1crypto-0.22.0-py2.py3-none-any.whl
Collecting idna>=2.1 (from cryptography>=1.5->paramiko)
  Using cached idna-2.6-py2.py3-none-any.whl
  Saved ./idna-2.6-py2.py3-none-any.whl
Collecting pycparser (from cffi>=1.4.1->pynacl>=1.0.1->paramiko)
  Could not find a version that satisfies the requirement pycparser (from cffi>=1.4.1->pynacl>=1.0.1->paramiko) (from versions: )
No matching distribution found for pycparser (from cffi>=1.4.1->pynacl>=1.0.1->paramiko)

有没有办法克服这个问题?我是否必须手动安装非二进制包(及其依赖项)?

谢谢,乔伊。

EN

回答 4

Stack Overflow用户

发布于 2019-09-13 00:58:10

您有两个选择:

  1. 在同一平台上运行下载操作(注意要相同)
  2. 修复主机

上的互联网访问

不要尝试其他花哨的方法,否则你会自找麻烦:一些依赖项需要编译!

票数 1
EN

Stack Overflow用户

发布于 2019-10-18 00:30:54

您可以在pip中使用--prefer-binary选项。这将使pip认为轮子更重要,即使它们是比现有sdist更旧的版本(sdist是源代码分发的缩写)。如果找不到兼容的轮子,则会选择sdist。

这是在PIP18.0中发布的(所以那是2018年初,pip现在正在使用CalVer )。

票数 0
EN

Stack Overflow用户

发布于 2021-10-27 11:52:44

@sorin是对的,您唯一真正的选择是使用与您将要安装依赖项完全相同的环境来下载依赖项。

我的解决方案是使用Docker构建一个与目标平台匹配的轮子。在我的例子中,它是Debian 10,但只要有可用的Docker镜像,它对任何操作系统和版本都是一样的。

代码语言:javascript
运行
复制
FROM python:3.9-slim-buster

COPY requirements.txt requirements.txt

RUN set -eux; \
    apt-get update && \
    apt-get install -y build-essential && \
    python3 -m venv .venv --without-pip

ENV VIRTUAL_ENV=.venv
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"

RUN set -eux; \
    curl --silent https://bootstrap.pypa.io/get-pip.py | python && \
    pip download --prefer-binary --upgrade setuptools wheel setuptools-rust -d deps && \
    pip download --prefer-binary -r requirements.txt -d deps && \
    mkdir -p main-wheel && \
    pip wheel --wheel-dir=main-wheel -r requirements.txt

构建图像并提取轮子:

代码语言:javascript
运行
复制
docker build -t buildwheel -f Dockerfile
mkdir -p artifacts
CONTAINER=$(docker create buildwheel || exit 1)
docker cp "${CONTAINER}":main-wheel artifacts/. || exit 1
docker rm "${CONTAINER}"
docker image rm buildwheel

恭喜,您现在在artifacts/main-wheel目录中有了一个专门用于Debian10和cPython 3.9的轮子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46287077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档