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

时间:2018-01-25 16:48:14

标签: 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 find a version that satisfies the requirement cffi==1.11.4 (from versions: )
No matching distribution found for cffi==1.11.4

我正在pypi网络服务器下运行apache服务器来处理https上的centos次请求。

我检查apache log /var/log/httpd/ssl_access_log,查看install命令。它为200返回GET 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> ,检查这2个套餐之间的响应是否有变化,但没有区别。

<modules>
  <add name="MyModule" type="MyNamespace.MyModule.Module, MyNamespace.MyModule"/>
</modules>

1 个答案:

答案 0 :(得分:2)

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

python版本检查

检查您的默认pip所指的python版本 - 是python3.5&#39; s pip

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

会给你信息。如果默认pip引用其他某个python版本,请直接使用python3.5调用pip&#39; {<1}}:

pip3.5

平台检查

尝试明确下载$ pip3.5 install -i https://localhost --trusted-host localhost cffi==1.11.4 平台的cffi软件包 - 是否会轮下载?

manylinux1_x86_64

如果下载成功,则目标计算机上的平台不匹配。检查$ pip download cffi --only-binary=:all: --platform manylinux1_x86_64 -i https://localhost --trusted-host localhost 识别的平台:

pip

ABI检查

一个不太常见的问题是ABI不匹配:你可以检查你的平台的ABI

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

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

如果您获得cp35m平台标记,则表示您拥有MacOS High Sierra。在本地PyPI服务器上,您已经上传了macosx_10_13_x86_64轮,只能安装在Linux上(cffi轮)。您无法在MacOS High Sierra上安装它。问题是,manylinux包装的代码部分用C语言编写,仅为目标平台编译。您有三种可能性来解决这个问题:

  1. 最简单的解决方案:下载macosx_10_13_x86_64 wheel from PyPI并将其与cffi滚轮一起上传到本地服务器。现在linux客户端将获得为linux编译的轮子,你将在运行manylinux1时为MacOS编译轮子。
  2. &#34; DIY&#34;解决方案:下载source tar installer from PyPI并将其与pip install cffi轮一起上传到本地服务器。现在linux客户端将获得编译轮,MacOS和Windows客户端将获得源tar,他们被迫在本地编译包含的C代码 - 如果操作系统没有提供正确的工具,安装将失败。
  3. 配置本地服务器以代理PyPI:如果请求了一个包但在本地服务器上找不到,它会将请求传递给manylinux1,如果在公共存储库中找到该包,则下载并通过本地服务器传递,就像在那里找到一样。但是,如果您的服务器支持此功能,则不确定。我们使用pypi.python.org,足以告诉您的索引它的基础应该devpiroot/pypi
  4. 请注意,这些解决方案不是相互排斥的:您可以将1和2组合在一起(Linux客户端将获得devpi index -m user/index bases=root/pypi个轮子,High Sierra获得manylinux1轮,其余的获取源焦油)甚至1 ,2和3一起。这一切都取决于您在本地服务器上上传和维护的内容。