简体   繁体   English

无法从 Amazon EC2 中的私有 pypi 服务器获取包

[英]Unable to fetch packages from private pypi server in Amazon EC2

For couple of reasons we decided to host all our private and public Python dependencies(and their dependencies) on Amazon S3.出于几个原因,我们决定在 Amazon S3 上托管我们所有的私有和公共 Python 依赖项(及其依赖项)。 We intend to download/install the packages only from S3 and nowhere else.我们打算仅从 S3 下载/安装软件包,而不会从其他任何地方下载/安装软件包。

I followed the steps mentioned at https://stackoverflow.com/a/57552988/3007402 (I wrote the answer) to setup pypi server on S3.我按照https://stackoverflow.com/a/57552988/3007402 (我写了答案)中提到的步骤在 S3 上设置了 pypi 服务器。

To upload public packages to S3, I would first download them using要将公共包上传到 S3,我会首先使用
pip download numpy==1.14.2
pip download statsmodels==0.6.1

To install any package I would use要安装我会使用的任何软件包

pip install pandas --index-url=http://<s3_endpoint> --trusted-host=<s3_endpoint> --no-cache-dir

Everything is working fine with packages that are downloaded as .whl files.对于下载为.whl文件的软件包,一切正常。 Such packages(for eg pandas ) are able to install themselves and their dependencies( numpy in case of pandas ) without any problems.这样的包(例如pandas )能够毫无问题地安装它们自己和它们的依赖项(在pandas情况下为numpy )。

The issue is with non-whl packages such as statsmodels-0.6.1.tar.gz .问题在于非 whl 软件包,例如statsmodels-0.6.1.tar.gz While pip is used to install statsmodels , to install the dependencies, statsmodels uses easy_install .虽然pip用于安装statsmodels ,但要安装依赖项, statsmodels使用easy_install
The pip arg --index-url is not used by easy_install and it would download the dependency - numpy from pypi.org. easy_install不使用 pip arg --index-url ,它会从 pypi.org 下载依赖项 - numpy

To fix this(download only from S3), I extracted statsmodels-0.6.1.tar.gz , edited setup.cfg , repackaged it and uploaded to S3.为了解决这个问题(仅从 S3 下载),我提取了statsmodels-0.6.1.tar.gz ,编辑了setup.cfg ,重新打包并上传到 S3。 Below is the content of setup.cfg :下面是setup.cfg的内容:

[egg_info]
tag_build =
tag_date = 0
tag_svn_revision = 0

# lines below are added by me
[easy_install]
index_url = http://<s3_link>
find_links = http://<s3_link>

With that change statsmodels fetches the dependency numpy from S3 and installs it successfully.通过该更改statsmodels从 S3 获取依赖项numpy并成功安装它。

For some odd reason, this only works in Ubuntu(local and EC2 running Ubuntu) but fails on an EC2 running Amazon Linux.出于某种奇怪的原因,这仅适用于 Ubuntu(本地和运行 Ubuntu 的 EC2),但在运行 Amazon Linux 的 EC2 上失败。 Below is the log I saved using --log <file> argument to pip.下面是我使用--log <file>参数保存到 pip 的日志。 I removed the timestamp for brevity.为简洁起见,我删除了时间戳。

Created temporary directory: /tmp/pip-ephem-wheel-cache-7SD5Bu
Created temporary directory: /tmp/pip-req-tracker-du4AEi
Created requirements tracker '/tmp/pip-req-tracker-du4AEi'
Created temporary directory: /tmp/pip-install-G2qw36
Looking in indexes: http://<s3_link>
Collecting statsmodels
  1 location(s) to search for versions of statsmodels:
  * http://<s3_link>/statsmodels/
  Getting page http://<s3_link>/statsmodels/
  Found index url http://<s3_link>
  Analyzing links from page http://<s3_link>/statsmodels/
    Found link http://<s3_link>/statsmodels/statsmodels-0.6.1.tar.gz (from http://<s3_link>/statsmodels/), version: 0.6.1
  Given no hashes to check 1 links for project 'statsmodels': discarding no candidates
  Using version 0.6.1 (newest of versions: 0.6.1)
  Created temporary directory: /tmp/pip-unpack-r8lKU4
  Found index url http://<s3_link>
  Downloading http://<s3_link>/statsmodels/statsmodels-0.6.1.tar.gz (7.1MB)
  Downloading from URL http://<s3_link>/statsmodels/statsmodels-0.6.1.tar.gz (from http://<s3_link>/statsmodels/)
  Added statsmodels from http://<s3_link>/statsmodels/statsmodels-0.6.1.tar.gz to build tracker '/tmp/pip-req-tracker-du4AEi'
    Running setup.py (path:/tmp/pip-install-G2qw36/statsmodels/setup.py) egg_info for package statsmodels
    Running command python setup.py egg_info
    No local packages or download links found for numpy
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-G2qw36/statsmodels/setup.py", line 449, in <module>
        **setuptools_kwargs)
      File "/usr/lib64/python2.7/distutils/core.py", line 111, in setup
        _setup_distribution = dist = klass(attrs)
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/setuptools/dist.py", line 265, in __init__
        self.fetch_build_eggs(attrs['setup_requires'])
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/setuptools/dist.py", line 311, in fetch_build_eggs
        replace_conflicting=True,
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 797, in resolve
        dist = best[req.key] = env.best_match(req, ws, installer)
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1047, in best_match
        return self.obtain(req, installer)
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1059, in obtain
        return installer(requirement)
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/setuptools/dist.py", line 378, in fetch_build_egg
        return cmd.easy_install(req)
      File "/home/ec2-user/tempenv/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 617, in easy_install
        raise DistutilsError(msg)
    distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('numpy')

Output of cat /etc/os-release (Amazon Linux details): cat /etc/os-release (Amazon Linux 详细信息):

NAME="Amazon Linux AMI"
VERSION="2017.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2017.03"
PRETTY_NAME="Amazon Linux AMI 2017.03"

Apparently, the EC2 running Amazon Linux was having an older version of setuptools .显然,运行 Amazon Linux 的 EC2 使用的是旧版本的setuptools
I upgraded to the latest version and my installation went fine.我升级到最新版本,安装正常。 😅 😅

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM