首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能使用Pip从PyPI安装包?

为什么我不能使用Pip从PyPI安装包?
EN

Stack Overflow用户
提问于 2021-11-13 21:15:57
回答 1查看 429关注 0票数 1

最近我还没能用Pip下载任何包。每次运行setup.py或构建轮时,status 1都会出错。以下是我得到的完整回溯的两个示例:

代码语言:javascript
复制
pip install miniupnpc
Collecting miniupnpc
  Downloading miniupnpc-2.0.2.tar.gz (67 kB)
     |████████████████████████████████| 67 kB 1.7 MB/s
  Preparing metadata (setup.py) ... done
Using legacy 'setup.py install' for miniupnpc, since package 'wheel' is not installed.
Installing collected packages: miniupnpc
    Running setup.py install for miniupnpc ... error
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\--------\AppData\Local\Programs\Python\Python310\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\--------\\AppData\\Local\\Temp\\pip-install-kjrhsl01\\miniupnpc_31f9b0505dac4eff85fe9636cdb81aad\\setup.py'"'"'; __file__='"'"'C:\\Users\\--------\\AppData\\Local\\Temp\\pip-install-kjrhsl01\\miniupnpc_31f9b0505dac4eff85fe9636cdb81aad\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\--------\AppData\Local\Temp\pip-record-8d4qnr7v\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\--------\AppData\Local\Programs\Python\Python310\Include\miniupnpc'
         cwd: C:\Users\--------\AppData\Local\Temp\pip-install-kjrhsl01\miniupnpc_31f9b0505dac4eff85fe9636cdb81aad\
    Complete output (4 lines):
    running install
    running build
    running build_ext
    error: [WinError 2] The system cannot find the file specified
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'C:\Users\--------\AppData\Local\Programs\Python\Python310\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\--------\\AppData\\Local\\Temp\\pip-install-kjrhsl01\\miniupnpc_31f9b0505dac4eff85fe9636cdb81aad\\setup.py'"'"'; __file__='"'"'C:\\Users\\--------\\AppData\\Local\\Temp\\pip-install-kjrhsl01\\miniupnpc_31f9b0505dac4eff85fe9636cdb81aad\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\--------\AppData\Local\Temp\pip-record-8d4qnr7v\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\--------\AppData\Local\Programs\Python\Python310\Include\miniupnpc' Check the logs for full command output.
代码语言:javascript
复制
Collecting conda
  Using cached conda-4.3.16.tar.gz (299 kB)
  Preparing metadata (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: 'C:\Users\--------\AppData\Local\Programs\Python\Python310\python.exe' -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\--------\\AppData\\Local\\Temp\\pip-install-08mbbg7s\\conda_86cbd4f55db04b2aae91751f0497a4e2\\setup.py'"'"'; __file__='"'"'C:\\Users\\--------\\AppData\\Local\\Temp\\pip-install-08mbbg7s\\conda_86cbd4f55db04b2aae91751f0497a4e2\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\--------\AppData\Local\Temp\pip-pip-egg-info-6ybygnj4'
       cwd: C:\Users\--------\AppData\Local\Temp\pip-install-08mbbg7s\conda_86cbd4f55db04b2aae91751f0497a4e2\
  Complete output (17 lines):

  WARNING: Your current install method for conda only supports conda
  as a python library.  You are not installing a conda executable command
  or activate/deactivate commands.  If your intention is to install conda
  as a standalone application, currently supported install methods include
  the Anaconda installer and the miniconda installer.  If you'd still like
  for setup.py to create entry points for you, use `utils/setup-testing.py`.

  Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "C:\Users\--------\AppData\Local\Temp\pip-install-08mbbg7s\conda_86cbd4f55db04b2aae91751f0497a4e2\setup.py", line 35, in <module>
      import conda._vendor.auxlib.packaging  # NOQA
    File "C:\Users\--------\AppData\Local\Temp\pip-install-08mbbg7s\conda_86cbd4f55db04b2aae91751f0497a4e2\conda\__init__.py", line 13, in <module>
      from .common.compat import iteritems, text_type
    File "C:\Users\--------\AppData\Local\Temp\pip-install-08mbbg7s\conda_86cbd4f55db04b2aae91751f0497a4e2\conda\common\compat.py", line 77, in <module>
      from collections import Iterable
  ImportError: cannot import name 'Iterable' from 'collections' (C:\Users\--------\AppData\Local\Programs\Python\Python310\lib\collections\__init__.py)
  ----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/74/4e/c533c3136427be62c38cc0e038cabf167bb54489c2ced2f6df903c456861/conda-4.3.16.tar.gz#sha256=a91ef821343dea3ba9670f3d10b36c1ace4f4c36d70c175d8fc8886e94285953 (from https://pypi.org/simple/conda/). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

我运行的是64位Windows 10和Python 3.10.0。我有最新的pipwheel。我已经尝试过重新安装Python和setuptools

EN

回答 1

Stack Overflow用户

发布于 2021-11-14 19:36:38

当你不能pip install一个包的时候,你的第一反应应该是检查它的PyPI页面。

让我们以流行的NumPy库为例。它的PyPI页面是https://pypi.org/project/numpy。在其他信息中,它目前声明:“需要: Python >=3.7,<3.11”。这是撰写本文时的最新版本1.21.4。以前的Python版本也支持较旧的NumPy安装,例如1.18.0只需要"Python >=3.5“。

对于最新的NumPy版本,其开发人员还指定Python版本需要低于3.11。以防万一。在撰写本文时,最新的Python版本是Python 3.10。换句话说,开发人员不能保证这个特定的NumPy包将与尚未发布的Python的未来版本一起工作。

NumPy不是一个纯Python库。它包含用C或其他编程语言编写的“扩展”,这些编程语言比Python本身“更接近金属”。正是这些扩展让NumPy变得更快。但是它们必须被编译成“本地指令”,即特定于操作系统(Windows、Linux、macOS)以及平台架构(32位、64位、苹果M1、ARM等)的代码。

如果要从源代码安装NumPy,则需要一个C编译器。在Linux上,该编译器是预先安装的。例如,在Windows上,您必须安装Visual Studio。但也可能存在其他“构建依赖项”,即除了编译器之外还需要安装的东西。这将取决于您正在为其构建/编译包的Python版本。这就是事情变得复杂的地方,最好避免这些复杂的情况。

当Pip只在PyPI上找到一个“源包”,并且该源包包含本机代码时,它会尝试编译它,即从源代码构建它。在那里可能会出很多问题。当出现问题时,Pip通常会报告ERROR: Command errored out with exit status 1,尽管实际的退出代码可能是不同的。

这就是说,你通常想在PyPI上找到一个预编译包。尤其是如果你使用的是Windows。在Linux上,甚至在macOS上,事情往往会运行得更顺畅。预编译包也称为二进制发行版,通常作为带有.whl文件扩展名的“轮子”文件分发。

要查看预编译轮是否适用于您的Python版本和平台,请单击PyPI页面上的"Download files“并检查显示的列表。对于问题中提到的MiniUPnP库,当前版本为2.2.3,该列表位于https://pypi.org/project/miniupnpc/2.2.3/#files,其中包括以下.whl文件:

代码语言:javascript
复制
miniupnpc-2.2.3-cp27-cp27m-win32.whl
miniupnpc-2.2.3-cp35-cp35m-win32.whl
miniupnpc-2.2.3-cp36-cp36m-win32.whl
miniupnpc-2.2.3-cp36-cp36m-win_amd64.whl
miniupnpc-2.2.3-cp37-cp37m-win32.whl
miniupnpc-2.2.3-cp37-cp37m-win_amd64.whl
miniupnpc-2.2.3-cp39-cp39-win32.whl
miniupnpc-2.2.3-cp39-cp39-win_amd64.whl

值得注意的是,Python3.10没有轮子,它的文件名中会有标记cp310。如果有这样的文件,Pip基本上只是解压缩它(因为轮子只不过是美化的zip归档),并将其内容复制到您的Python安装程序中,无论它在您的机器上。但是在这里安装失败了,因为没有轮子,Pip甚至找不到可以编译的源代码发行版,它应该是一个.tar.gz文件。

对于conda库,它找到了源代码发行版conda-4.3.16.tar.gz,但无法对其进行编译。为什么它失败了,留给读者作为练习。

更重要的是,轮子作为一种打包格式,也可用于纯Python库,即那些不包含本机扩展的库。例如,PyPI page for the PySerial library (currently)仅列出两个安装包:

代码语言:javascript
复制
pyserial-3.5-py2.py3-none-any.whl
pyserial-3.5.tar.gz

第一个是一个轮子,第二个是源代码分布。在这种情况下,几乎没有区别。作为一个纯Python包,它不需要编译。这两个文件基本上都只包含Python源代码,但除此之外没有什么“复杂”的东西。这就是noneany标记所暗示的。在最新的Python版本或未来的Python版本上安装它应该不会有问题,即使库还没有更新。(只要Python不在自己的语法中引入任何向后不兼容的更改,就是这样。)

另一个教训是:如果您坚持使用最新的Python版本,那么请注意,您想要安装的许多库可能需要新的构建。即上载到PyPI的新控制盘文件。也就是说,一个新的版本。开发人员通常直到几个月后才开始使用它,即使对于流行的库也是如此。因此,也许可以多停留在以前的Python版本上一段时间。或者查找你需要的库,并确保在升级之前已经在PyPI上发布了新的轮子(如果需要)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69958307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档