如何修复在安装包时出现的Python“没有此文件或目录”编译器错误。

引言

开篇

安装Python模块时,您可能会遇到一个常见错误,即“找不到文件或目录”。这可能会导致误解,因为您通常不会缺少要安装的软件包中的文件或目录。相反,这个错误是由于Python在安装模块期间尝试调用您的系统编译器所引起的。这是因为您系统编译器的路径通常是硬编码到Python本身中,而Python却找不到所需的编译器文件。本教程将提供一个此错误的示例,以及修复它的多个平台上的步骤。

编译器错误漏掉了

通常情况下,Python包是通过pip包管理器和pip install命令进行安装的。pip会打印出所选包所需的其他依赖项列表,以及安装过程中的长列表输出。有时,安装程序会在输出的末尾附近包含以下类似文本的错误信息。

Output
x86_64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.10 -I/usr/local/lib/python3.10/dist-packages/numpy/core/include -I/usr/include/python3.10 -c radiomics/src/_cmatrices.c -o build/temp.linux-x86_64-3.10/radiomics/src/_cmatrices.o error: command 'x86_64-linux-gnu-gcc' failed: No such file or directory [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: legacy-install-failure × Encountered error while trying to install package. ╰─> pyradiomics note: This is an issue with the package mentioned above, not pip. hint: See above for output from the failure.

这个特定的错误是由于使用pip install pd-dwi尝试安装用于化疗研究的Python库pd-dwi所导致的。

一些Python库,特别是用于科学计算的,安装后需要在本机上编译额外的代码。Python是一种高级解释型语言,只需要Python解释器本身就可以运行。对于一些需要高性能处理的Python库,有时会包含低级语言如C或Rust,这些语言需要在可执行之前进行编译和优化。如果系统中没有编译器,则安装将失败。

在大部分现代平台上,当你安装Python的软件包管理器pip时,它也会设置编译环境以及相关的软件包。然而,这并不总是发生的原因有几个。例如,编译器可能会意外被卸载,或者从一开始就没有安装。与Linux不同的是,在Mac或Windows上,Python软件包通常不会通过系统软件包管理器安装,这为出现问题创造了更多机会。

本教程的以下步骤将提供在Ubuntu/Debian Linux、Red Hat/Rocky Linux、Windows和macOS上安装和验证与Python兼容的编译器的说明。

Ubuntu和Debian的编译器套件

在Ubuntu上,你可以安装一个叫做build-essential的软件包,它会提供现代、得到良好支持的编译环境所需的所有软件包。build-essential被称为元软件包。它不指代任何一个具体的软件包,而是作为依赖项引入了许多常见的编译工具。

你还可以安装libpython3-dev。这是一个长期存在的Ubuntu/Debian生态系统的软件包,它可以将编译器与Python连接起来,并提供了所有必要的后端配置,以便从Python或pip中自动调用编译器。通常,它会随着pip的安装而自动安装,但如果你使用包管理器之外的方式安装pip,可能会遗漏它。

使用apt安装软件包。

  1. sudo apt install build-essential libpython3-dev

这也将安装一些依赖项。之后,你可以通过检查系统中是否存在make命令来验证编译器是否可用。要做到这一点,使用which命令即可。

  1. which make
Output
/usr/bin/make

如果你的路径上已经安装了make(gcc,最流行的开源编译器)的命令,它将使用这个命令解析Makefile,而Makefile是提供每个软件包内的编译指令的方式。如果你现在的路径上已经安装了make的版本,请再次尝试使用pip安装你的Python模块。

用于Red Hat和Rocky Linux的编译器软件包。

在Red Hat和Rocky Linux上,你可以使用dnf软件包管理器的组功能来安装一组包括良好支持的编译环境的软件包。你要安装的软件包组称为“开发工具”。

使用两个dnf命令安装软件包组:

  1. sudo dnf groups mark install "Development Tools"
  2. sudo dnf groupinstall "Development Tools"

同时,这将安装一些依赖项。接下来,您可以安装python3-devel,这是一个长期存在的红帽生态系统包,基本上将编译器与Python连接起来。python3-devel为从Python或pip自动调用您的编译器提供了所需的后端配置。

  1. sudo dnf install python3-devel

之后,您可以通过检查系统上是否存在make命令来验证是否可用编译器。要这样做,请使用which命令。

  1. which make
Output
/usr/bin/make

使用pip安装Python模块之前,确保您的路径上已安装了版本的make,并尝试运行gcc命令解析Makefile。Makefile是每个软件包中提供编译指令的方式。

Windows 编译环境

在Windows上编译器问题可能更棘手,因为安装Python有许多不同的方式,每一种方式都要求安装不同的编译器。

  • If you use Python with WSL2, it’s just like running Python under Linux, so you can follow the troubleshooting instructions for your distro (Ubuntu by default).
  • If you use Python with Anaconda, it will provide its own compiler packages within the conda environment, usually avoiding any of these errors in the first place.
  • If you use Python on Windows natively, there are a few other considerations. By default, Python on Windows tries to use the Microsoft Visual Studio Build Tools. This is a very large install and adds many Windows ecosystem packages that may be unfamiliar if you mostly work in the cloud, but should work automatically after installation, like installing make on Linux.
  • If you already have a working version of open-source gcc and make build tooling installed in your Windows environment using MinGW or Chocolatey, you can tell Python to use this compiler on Windows instead, by creating a file at Lib/distutils/distutils.cfg relative to your Python install path and adding the following contents:
Lib/distutils/distutils.cfg
[build]
compiler=mingw32

[build_ext]
compiler=mingw32

如果在Windows上安装编译器遇到困难,你可以尝试安装预编译的wheel软件包,而不是从pip进行安装。不过,这种方法相对不太方便,而且这些软件包通常只能临时获取。

macOS编译环境

macOS将其编译器工具链捆绑到Apple的开发套件XCode中。就像Windows上的Visual Studio一样,XCode是一个完整的开发环境,具有自己的界面,但实际上您不需要使用XCode本身来编译Python软件包。相反,您只需要确保安装了XCode软件包。您可以通过运行xcode-select -install来实现这一点。

  1. xcode-select --install

您将收到一个提示以开始安装,然后再次收到一个提示以接受软件许可。接下来,工具将自动下载并安装。

结论是…

Python生态系统非常强大,对于初学者和专家开发者都非常友好,但是遇到工具方面的缺失可能会令人困惑。在本教程中,您学会了如何修复由于缺少编译器包而可能引起的错误,以及当Python在模块安装时需要编译低级代码的情况。

接下来,您可能想要复习我们的Python编程系列教程。