Python pip能够搜索软件包,但安装失败并出现错误

Python pip能够搜索软件包,但安装失败并出现错误,python,apache,pip,pypiserver,Python,Apache,Pip,Pypiserver,我有本地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

我有本地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
我正在
apache
webserver下运行
pypi
服务器,以处理
centos
上的
https
请求

我检查apache日志
/var/log/httpd/ssl\u access\u log
,查看
安装
命令。对于
GET Call
,它返回
200

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
我再次检查日志。对于
芹菜
有效,之后对于
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
。在
芹菜
中,它在
GET/simple/cellery/
之后进入
/packages/cellery*

我试图
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>
$curl-khttps://localhost/simple/celery/ -我
HTTP/1.1200ok
日期:2018年1月25日星期四格林尼治标准时间16:59:27
服务器:Apache/2.2.15(CentOS)
内容长度:321
连接:关闭
内容类型:text/html;字符集=UTF-8
芹菜链接
芹菜链接

$curl-khttps://localhost/simple/cffi/ -我 HTTP/1.1200ok 日期:2018年1月25日星期四格林尼治标准时间16:59:29 服务器:Apache/2.2.15(CentOS) 内容长度:339 连接:关闭 内容类型:text/html;字符集=UTF-8 cffi的链接 cffi的链接

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

python版本检查 检查默认的
pip
引用的python版本-是
python3.5
pip

$ pip -V | grep -o "(.*)"
我会给你信息的。如果默认的
pip
引用了其他python版本,则直接使用
pip3.5
调用
python3.5
pip

$ pip3.5 install -i https://localhost  --trusted-host localhost cffi==1.11.4
平台检查 尝试显式下载
manylinux1_x86_64
平台的
cffi
软件包-控制盘会下载吗

$ 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不匹配:您可以使用

$ python3.5 -c "import pip; print(pip.pep425tags.get_abi_tag())"
此字符串应与平台标记之前的控制盘名称前缀匹配,因此在您的情况下,您的ABI应为
cp35m


如果您获得了
macosx_10_13_x86_64
platform标签,这意味着您拥有MacOS High Sierra。在本地PyPI服务器上,您已上载只能安装在linux上的
cffi
控制盘(
manylinux
wheel)。您将无法在MacOS High Sierra上安装它。问题是,
cffi
package提供的代码部分是用C编写的,并且仅为目标平台编译。您有三种可能解决此问题:

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

  • 请注意,这些解决方案并不是相互排斥的:您可以将1与2结合起来(linux客户端将获得
    manylinux1
    wheels,High Sierra获得
    macos_10_13
    wheel,其余获得源代码tar),甚至可以将1、2和3结合在一起。这一切都取决于你想要/需要/可以上传什么并在你的本地服务器上进行维护。

    hoefling,当我运行
    pip下载cffi
    它下载
    cffi-1.11.4-cp35-cp35m-manylinux1\u x86\u 64。whl
    ,和
    获取patform
    返回
    macosx\u 10\u 13\u x86\u 64
    ,如何解决这个问题?@Nilesh你有三种可能性,让我把它们写在答案中。谢谢,这很有帮助,我从来没有想过
    whl
    是特定于平台的:)@Nilesh一般来说,如果包中只包含Python代码(那么你的文件名中就没有
    None
    ,这表明平台不相关),但是一旦有了C扩展,事情很快就会变得很棘手。