Исправление ошибки ‘No such file or directory’ при установке пакетов

Введение

Частой ошибкой, которую вы можете получить при установке модулей Python, является ошибка ‘No such file or directory‘. Эти слова могут ввести в заблуждение, потому что обычно все файлы и каталоги из пакета, который вы пытаетесь установить находятся на своих местах. На самом деле, ошибка возникает из-за того, что 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.

Конкретно эта ошибка возникла в результате попытки установить pd-dwi с помощью pip install pd-dwi. Это библиотека Python, используемая в исследованиях химиотерапии.

Некоторые библиотеки Python, особенно те, которые используются для научных вычислений, после установки требуют компиляции дополнительного кода локально на вашей машине. Python – это интерпретируемый язык высокого уровня, который может работать только с интерпретатором Python. Языки низкого уровня, такие как C или Rust, которые иногда включаются в библиотеки Python для высокопроизводительной обработки, должны быть скомпилированы и оптимизированы, прежде чем стать исполняемыми. Если в вашей системе нет компилятора, установка завершится неудачно.

На большинстве современных платформ, когда вы устанавливаете менеджер пакетов Python, pip, он также устанавливает среду компилятора и соответствующие пакеты. Однако есть несколько причин, по которым этого может не произойти. Например, возможно, что компилятор был случайно удален или вообще не был установлен. И в отличие от Linux, на Mac или Windows пакеты Python обычно не устанавливаются системным менеджером пакетов, что может стать причиной возникновения проблем.

Следующие шаги этого руководства содержат инструкции по установке и проверке совместимого с Python компилятора на Ubuntu/Debian Linux, Red Hat/Rocky Linux, Windows и macOS.

Пакеты компиляторов для Ubuntu и Debian

На Ubuntu вы можете установить пакет build-essential, который предоставит все пакеты, необходимые для современной, хорошо поддерживаемой среды компилятора. build-essential – это так называемый мета-пакет. Он не относится к какому-то одному пакету, а скорее привлекает ряд общих инструментов компилятора в качестве зависимостей.

Вы также можете установить libpython3-dev. Это пакет экосистемы Ubuntu/Debian, который по сути “подключает” компилятор к Python и предоставляет всю необходимую конфигурацию бэкенда для автоматического вызова компилятора из Python или из pip. Обычно он устанавливается автоматически вместе с pip, но если вы устанавливаете pip без использования менеджера пакетов, он может отсутствовать.

Установите пакеты с помощью apt:

$ sudo apt install build-essential libpython3-dev

Это также приведет к установке ряда зависимостей. После этого вы можете убедиться в наличии компилятора, проверив существование команды make в вашей системе. Для этого используйте команду which:

$ which make

Output
/usr/bin/make

make – это команда, которую gcc, самый популярный компилятор с открытым исходным кодом, использует для разбора Makefile, то есть инструкции по компиляции, которые предоставляются в каждом пакете. Теперь, если make существует, попробуйте снова установить ваш модуль Python с помощью pip.

Пакеты компиляторов для Red Hat и Rocky Linux

В Red Hat и Rocky Linux вы можете использовать функцию groups менеджера пакетов dnf для установки пакетов, которые включают хорошо поддерживаемую среду компилятора. Группа пакетов, которую вы установите, называется “Development Tools”.

Для установки группы пакетов используйте две команды dnf:

$ sudo dnf groups mark install "Development Tools"
$ sudo dnf groupinstall "Development Tools"

Это также приведет к установке ряда зависимостей. Далее вы можете установить python3-devel, пакет экосистемы Red Hat, который по сути “подключает” компилятор к Python. python3-devel предоставляет всю необходимую конфигурацию бэкенда для автоматического вызова компилятора из Python или из pip:

$ sudo dnf install python3-devel

После этого вы можете убедиться, что компилятор доступен, проверив наличие команды make в вашей системе. Для этого используйте команду which:

$ which make

Output
/usr/bin/make

Если теперь make существует, попробуйте снова установить ваш модуль Python с помощью pip.

Среды компиляторов Windows

Проблемы с компилятором в Windows могут быть сложнее, поскольку существует множество различных способов установки Python, и каждый из них предполагает наличие различных компиляторов:

  • Если вы используете Python с WSL2, это то же самое, что запустить Python под Linux, поэтому вы можете следовать инструкциям по устранению неполадок для вашего дистрибутива (Ubuntu по умолчанию).
  • Если вы используете Python с Anaconda, то она предоставит свои собственные пакеты компилятора в среде conda, что обычно позволяет избежать подобных ошибок.
  • Если вы используете Python в Windows, есть несколько других решений. По умолчанию Python на Windows пытается использовать Microsoft Visual Studio Build Tools. Это очень большая установка, добавляющая множество пакетов экосистемы Windows, которые могут быть вам незнакомы, если вы в основном работаете в облаке, но они должны работать автоматически после установки, как make в Linux.
  • Если у вас уже есть рабочая версия gcc с открытым исходным кодом и инструменты сборки make, установленные в вашей среде Windows с помощью MinGW или Chocolatey, вы можете указать Python использовать этот компилятор, создав файл в Lib/distutils/distutils.cfg относительно пути установки Python и добавив следующее содержимое:
[build]
compiler=mingw32

[build_ext]
compiler=mingw32

Если у вас возникли проблемы с установкой компилятора в Windows, вы можете попробовать установить предварительно скомпилированный пакет wheel для устанавливаемой библиотеки, хотя это менее удобно, чем установка из pip. Кроме того, они обычно доступны только на разовой основе.

Среды компиляторов macOS

macOS включает инструментарий компилятора в пакете разработки Apple, XCode. Как и Visual Studio в Windows, XCode представляет собой полноценную среду разработки со своим собственным интерфейсом, но для компиляции пакетов Python вам не потребуется использовать сам XCode. Вместо этого вам нужно только убедиться, что пакеты XCode установлены. Это можно сделать, выполнив команду xcode-select -install:

$ xcode-select –install

Вам будет предложено начать установку, а затем принять лицензию на программное обеспечение. После этого инструменты будут загружены и установлены автоматически.

Заключение

Экосистема Python очень мощная, она приветлива как для начинающих, так и для опытных разработчиков, но столкновение с пробелами в ее инструментарии может сбить с толку. В этом руководстве вы узнали, как исправить ошибки, которые могут возникнуть в результате отсутствия пакетов компилятора, а также когда Python необходимо скомпилировать низкоуровневый код во время установки модуля.

Перевод статьи «How to Fix Python `No such file or directory` Compiler Errors When Installing Packages».