2

我有本地 pypi 服务器,我在其中上传了cffi包。

当我尝试搜索时,它会返回包。

$ pip search -i https://localhost --trusted-host localhost cffi
cffi (1.11.4)  - 1.11.4

但是当尝试安装时,它给出了错误。

$ pip install -i https://localhost  --trusted-host localhost cffi==1.11.4
Collecting cffi==1.11.4
  Could not find a version that satisfies the requirement cffi==1.11.4 (from versions: )
No matching distribution found for cffi==1.11.4

我在 webserverpypi下运行服务器来apache处理https.centos

我检查了 apache 日志/var/log/httpd/ssl_access_log,以获取install命令。它的回报200GET Call.

127.0.0.1 - - [25/Jan/2018:16:46:23 +0000] "GET /cffi/ HTTP/1.1" 303 -
127.0.0.1 - - [25/Jan/2018:16:46:23 +0000] "GET /simple/cffi/ HTTP/1.1" 200 339

我再次检查日志。因为celery它有效,之后cffi它失败了。

127.0.0.1 - - [25/Jan/2018:16:50:58 +0000] "GET /celery/ HTTP/1.1" 303 -
127.0.0.1 - - [25/Jan/2018:16:50:58 +0000] "GET /simple/celery/ HTTP/1.1" 200 321
127.0.0.1 - - [25/Jan/2018:16:50:58 +0000] "GET /packages/celery-4.0.2-py2.py3-none-any.whl HTTP/1.1" 200 396437
127.0.0.1 - - [25/Jan/2018:16:50:59 +0000] "GET /cffi/ HTTP/1.1" 303 -
127.0.0.1 - - [25/Jan/2018:16:50:59 +0000] "GET /simple/cffi/ HTTP/1.1" 200 339

问题是,因为cffi它没有重定向到/packages/cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl. 而在celery其去/packages/celery*之后GET /simple/celery/

我试图curl检查这两个包之间的响应是否有变化,但没有区别。

$ curl -k https://localhost/simple/celery/ -i
HTTP/1.1 200 OK
Date: Thu, 25 Jan 2018 16:59:27 GMT
Server: Apache/2.2.15 (CentOS)
Content-Length: 321
Connection: close
Content-Type: text/html; charset=UTF-8

    <html>
        <head>
            <title>Links for celery</title>
        </head>
        <body>
            <h1>Links for celery</h1>
                 <a href="/packages/celery-4.0.2-py2.py3-none-any.whl#md5=3ff97b53107b491baeb42f662be14a06">celery-4.0.2-py2.py3-none-any.whl</a><br>
        </body>
    </html>
$ curl -k https://localhost/simple/cffi/ -i
HTTP/1.1 200 OK
Date: Thu, 25 Jan 2018 16:59:29 GMT
Server: Apache/2.2.15 (CentOS)
Content-Length: 339
Connection: close
Content-Type: text/html; charset=UTF-8

    <html>
        <head>
            <title>Links for cffi</title>
        </head>
        <body>
            <h1>Links for cffi</h1>
                 <a href="/packages/cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl#md5=c9478cf605b4eb2755fa322cc2bf3ddf">cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl</a><br>
        </body>
    </html>
4

1 回答 1

2

面对此问题时最常见的两个问题是平台不匹配或 python 版本不匹配。

python版本检查

检查您的默认值pip所指的 python 版本 - 是python3.5'spip吗?

$ pip -V | grep -o "(.*)"

会给你信息。如果 defaultpip指的是其他 python 版本,请直接调用python3.5's :pippip3.5

$ pip3.5 install -i https://localhost  --trusted-host localhost cffi==1.11.4

平台检查

尝试显式下载平台的cffimanylinux1_x86_64- 轮子会下载吗?

$ pip download cffi --only-binary=:all: --platform manylinux1_x86_64 -i https://localhost --trusted-host localhost

如果下载成功,您的目标机器上的平台不匹配。检查哪个平台被识别pip

$ python3.5 -c "import pip; print(pip.pep425tags.get_platform())"

ABI 检查

一个不太常见的问题是 ABI 不匹配:您可以使用以下命令检查平台的 ABI

$ python3.5 -c "import pip; print(pip.pep425tags.get_abi_tag())"

此字符串应与平台标记之前的轮名称中的前缀匹配,因此在您的情况下,您的 ABI 应该是cp35m.


如果您获得macosx_10_13_x86_64平台标签,这意味着您拥有 MacOS High Sierra。在您的本地 PyPI 服务器上,您已经上传了cffi只能安装在 linux 上的轮子(manylinux轮子)。您将无法在 MacOS High Sierra 上安装它。问题是,cffi包提供的代码部分是用 C 语言编写的,并且只为目标平台编译。您有三种可能性来解决这个问题:

  1. macosx_10_13_x86_64最简单的解决方案:从 PyPI下载轮子并将其与轮子一起上传到本地服务器manylinux1。现在 linux 客户端将获得为 linux 编译的轮子,您将在运行时获得为 MacOS 编译的轮子pip install cffi
  2. “DIY”解决方案:从 PyPI 下载源 tar 安装程序,并将其上传到您的本地服务器manylinux1上。现在 linux 客户端将获得编译后的轮子,MacOS 和 Windows 客户端将获得源 tar,它们被迫在本地编译包含的 C 代码 - 如果操作系统不提供正确的工具,安装将失败。
  3. 配置本地服务器以代理 PyPI:如果请求了一个包,但在本地服务器上找不到,它会将请求传递到pypi.python.org公共存储库中,如果在公共存储库中找到该包,则下载并通过本地服务器传递好像在那里被发现一样。但是,不确定您的服务器是否支持此功能。我们使用devpiwhere 它足以告诉您的索引它应该root/pypi在其基础中具有:devpi index -m user/index bases=root/pypi.

请注意,这些解决方案并不相互排斥:您可以将 1 与 2 组合(Linux 客户端将获得manylinux1轮子,High Sierra 获得macos_10_13轮子,其余的获得源 tar),甚至可以将 1、2 和 3 组合在一起。这完全取决于您想要/需要/可以在本地服务器上上传和维护的内容。

于 2018-01-26T11:34:10.597 回答