Python.h находится в ПУТИ, но все еще не найден

#python #c #header-files #filepath

#python #c #заголовочные файлы #путь к файлу

Вопрос:

Я создаю модуль Python с использованием C, хотя при использовании #include <Python.h> он сообщает, что нашел этот файл, хотя я добавил его в пользовательскую PATH переменную.

Если я использую #include "C:/Users/<my user>/AppData/Local/Programs/Python/Python38/include/Python.h" , это работает на моем компьютере, хотя это приводит к ошибкам при импорте через PyPI, поэтому я хотел бы, чтобы работал первый метод.

Любые идеи относительно того, как я могу это исправить, были бы с благодарностью приняты!

Комментарии:

1. Вы забыли упомянуть, какой компилятор C вы используете, но я не думаю, что кто-либо из них использует PATH переменную для определения своего шаблона поиска по каталогу include.

2. PATH Переменная среды — это путь поиска для исполняемых файлов, а не для C, включаемых в файлы.

3. Я забыл упомянуть, что ошибка в CLion, а не при его компиляции и загрузке. Извините за это…

4. Компилятор Microsoft C поддерживает аргументы командной строки, которые указывают, где искать файлы заголовков, поэтому параметр для файлов заголовков Python может отсутствовать (не имеет ничего общего с PATH переменной окружения).

5. Разве у CLion нет настроек проекта для настройки путей включения файлов?

Ответ №1:

Я не знаю ни одного компилятора, который использует PATH для поиска включенных файлов. Вместо этого они используют отдельную переменную среды, такую как C_INCLUDE_PATH . Вам нужно найти правильную переменную среды для установки.

Вы почти наверняка можете установить это где-нибудь в настройках CLion, либо глобально, либо для конкретного проекта. Ознакомьтесь с их файлом справки: https://www.jetbrains.com/help/clion/managing-included-files.html и https://www.jetbrains.com/help/clion/absolute-path-variables.html

В качестве альтернативы, у всех компиляторов есть опция командной строки для указания пути поиска include. Для gcc используйте -I .

Ответ №2:

Я нашел способ обойти эту проблему, просто используя определения, специфичные для препроцессора и CLion:

 #ifdef __CLION_IDE_
#include "C:/Users/<user>/AppData/Local/Programs/Python/Python38/include/Python.h"
#include "C:/Users/<user>/AppData/Local/Programs/Python/Python38/include/structmember.h"
#else
#include <Python.h>
#include <structmember.h>
#endif
  

который будет использовать определенный путь в CLion и заголовок при сборке модуля python.

Комментарии:

1. Это не макрос, вы используете препроцессор компилятора C.

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

3. @Code-Apprentice: Почему именно использование переменной среды для указания пути к включаемому файлу предпочтительнее (при условии, что CLion его поддерживает).?

4. @martineau Это более гибко, скажем, если OP хочет выполнить сборку на основе другой версии Python, тогда единственное изменение касается envvar, а не кода.