【问题标题】:How are Python's C and C++ libraries cross platform? [closed]Python 的 C 和 C++ 库如何跨平台? [关闭]
【发布时间】:2021-01-23 10:22:24
【问题描述】:

许多 Python 的库,例如Pandas 和 Numpy 实际上是 C 或 C++,并带有 Python 包装器。我没有编译语言的经验,也不了解这些库是如何跨平台的(即在 Mac、Windows、Linux 上运行),因为我的理解是 C 和 C++ 需要针对特定​​的操作系统进行编译。这是如何工作的?

编辑:
How do you compile Python C/C++ extensions for different OS/versions of Python? 没有回答我的问题,因此这不是重复的。这个问题是关于理解它是如何工作的,这个问题假定了这种理解并且是关于实现的。

【问题讨论】:

  • 您已经回答了这个问题。它们需要针对目标平台进行编译
  • 他们为不同的平台发布构建,你可以看到它们都列在例如pypi.org/project/numpy/#files.
  • Python 本身也是跨平台的。 Python 解释器是用 C 编写的。它是为每个平台单独编译的。例如,在 Windows 上,您最终会得到 python.exe
  • Python 既有纯 Python 模块,也有已编译扩展的模块。这些必须按平台编译,并且通常按机器编译,以解决库和绑定的各种差异。

标签: python c++ c


【解决方案1】:

正如在 cmets 中所指出的,使用 C/C++ 编译代码的 Python 包需要在目标架构上编译才能跨平台。

在后台,例如,当您使用 pip install pandas 时,pip 将在 PyPI 上查找请求的包,如果可用,它将安装与您的特定系统相对应的 wheel。轮子是一种分发机制,可帮助在特定的 Python 分发和/或目标架构上安装 Python 包。再次以 pandas 为例,今天早上 pandas 的升级返回如下:

applepie:~ applepie$ pip install pandas --upgrade
Collecting pandas
  Downloading pandas-1.1.3-cp38-cp38-macosx_10_9_x86_64.whl (10.1 MB)
     |████████████████████████████████| 10.1 MB 7.2 MB/s 
Requirement already satisfied, skipping upgrade: numpy>=1.15.4 in ./.pyenv/versions/3.8.5/lib/python3.8/site-packages (from pandas) (1.19.2)
Requirement already satisfied, skipping upgrade: pytz>=2017.2 in ./.pyenv/versions/3.8.5/lib/python3.8/site-packages (from pandas) (2020.1)
Requirement already satisfied, skipping upgrade: python-dateutil>=2.7.3 in ./.pyenv/versions/3.8.5/lib/python3.8/site-packages (from pandas) (2.8.1)
Requirement already satisfied, skipping upgrade: six>=1.5 in ./.pyenv/versions/3.8.5/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)
Installing collected packages: pandas
  Attempting uninstall: pandas
    Found existing installation: pandas 1.1.2
    Uninstalling pandas-1.1.2:
      Successfully uninstalled pandas-1.1.2
Successfully installed pandas-1.1.3

请注意,执行的第一步是下载与我的特定架构(Mac OSX、x86_64)匹配的 .whl 文件。文件名有更多信息,例如它是 pandas v 1.1.3 并且与 CPython 3.8 兼容。在不同的机器上运行这个命令会产生不同的输出。

您可以查看 pip 的可用文件列表以直接在 PyPI 上查找。同样,寻找pandas on PyPI 表明,在 CPython 3.8 上用于 Mac OSX 的最新轮子名为 pandas-1.1.3-cp38-cp38-macosx_10_9_x86_64.whl,这毫不奇怪是 pip install pandas --upgrade 下载并安装的。

我不是 python 分发方面的专家,事实上我是最近才接触到 python 轮子,从未分发过 python 代码并且不得不做some reading prior to answering this question,但是我的理解是带有 C/C++ 组件的 Python 包会首先需要在每个架构上进行编译,然后为 python 版本和计算机架构的组合构建一个特定的轮子。如果没有找到兼容的轮子,安装带有 C/C++ 的 Python 包可能需要编译。

【讨论】:

  • 谢谢,这正是我正在寻找的答案。由于您的回答如此准确和明确,我认为这表明我的问题在主题上具有足够的质量,而不是重复,因此我投票决定重新提出问题。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多