Python pip能够搜索软件包,但安装失败并出现错误
我有本地pypi服务器,在那里我上传了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
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扩展,事情很快就会变得很棘手。