微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

离线环境安装python包没有找到已安装的依赖

如何解决离线环境安装python包没有找到已安装的依赖

我正在尝试在离线环境中从源代码安装 sqlACodegen 包及其依赖项(inflect、setuptools-scm)。具体来说,我在 Red Hat Enterprise Linux 7 系统上使用 Python 3.8 安装了 Anaconda 2020.07。

我将 Anaconda bin 目录预先添加到 PATH,并且我使用 python -m pip install whatever.tar.gz 进行安装。是的,我知道像这样使用 pip 而不是 conda 是一种罪过。碰巧的是,在安装上游软件包时,这是一种更简单的方法,而且我以前安装许多其他软件包时从未遇到过问题。

问题是 pip 正试图去 Internet 下载并安装 setuptools。奇怪的是setuptools已经安装好了,并且符合包的版本要求。即使我指定了 --no-index -f /path/to/packages 之类的 pip 标志,它仍然无法检测到已安装的 setuptools 并尝试从某处拉取它。

示例输出

[root@myserver stuff]# ls
inflect-4.1.0.tar.gz  setuptools_scm-4.1.2.tar.gz  sqlacodegen-2.1.0.tar.gz
[root@myserver stuff]# which python
/usr/local/anaconda-2020.07/bin/python
[root@myserver stuff]# python -V
Python 3.8.3
[root@myserver stuff]# python -m pip list | grep setuptools
setuptools                             49.2.0.post20200714
[root@myserver stuff]# python -m pip install --no-index -f . sqlacodegen-2.1.0.tar.gz
Looking in links: .
Processing ./sqlacodegen-2.1.0.tar.gz
  Installing build dependencies ... error
  ERROR: Command errored out with exit status 1:
   command: /usr/local/anaconda-2020.07/bin/python /usr/local/anaconda-2020.07/lib/python3.8/site-packages/pip install --ignore-installed --no-user --prefix /tmp/pip-build-env/r61p50oe/overlay --no-warn-script-location --no-binary :none: --only-binary :none: --no-index --find-links . -- 'setuptools >= 36.2.7' wheel 'setuptools_scm >= 1.7.0'
       cwd: None
  Complete output (3 lines):
  Looking in links: .
  ERROR: Could not find a version that satisfies the requirement setuptools>=36.2.7 (from versions: none)
  ERROR: No matching distribution found for setuptools>=36.2.7

我有一种感觉,--ignore-installed 标志可能是问题的一部分,但我不知道如何覆盖它,它看起来像 pip 自己打了许多选项。有没有人遇到过类似的情况并解决了?

解决方法

从源代码安装时,您需要添加 install 选项 --no-build-isolation,并且您希望告诉 Pip 使用已安装的包来满足构建依赖项。强调构建依赖项。

根据 PEP 518,最常见的构建依赖项是 setuptoolswheel。以至于,作为“构建系统执行的最低要求”,构建工具应该默认将它们添加到构建配置中。

从源代码安装新包时,就构建依赖项而言,Python 环境中的包将被忽略。作为Pip documentation explains

在提供构建需求时,pip 在隔离环境中这样做。也就是说,pip 不会将这些要求安装到用户的 site-packages 中,而是将它们安装在一个临时目录中,在构建期间将其添加到用户的 sys.path 中。这确保构建需求的处理独立于用户的运行时环境。例如,需要安装最新版本的 setuptools 才能构建的项目仍然可以安装,即使用户安装了旧版本(并且无需静默替换该版本)。

在您的示例中,该临时目录似乎是 /tmp/pip-build-env/r61p50oe。除了 --no-build-isolation 选项,您还可以将 setuptoolswheel 的源包(可能更多,取决于您安装的包)添加到通过 { {1}}/-f 选项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。