Не удается найти libpython3.dll с компилятором msys2 и запустить в родном Windows.

Вопрос или проблема

В настоящее время я работаю над встраиванием Python в C

Но я столкнулся с проблемой: я не могу запустить это в оригинальной Windows.

Команда в командной строке для msys2: gcc test.c -IC:/msys64/mingw32/include/python3.11 -I. -LC:/msys64/mingw32/lib -lpython3 -llibffi -LC:/msys64/mingw32/lib/python3.11 -lpython3.11 -D__TEST__

Настройки уже написаны в C-коде.

C-код представлен ниже

# Файл настроек
msys2=C:/msys64/mingw32
pythonpath_env=C:/msys64/home/xxx/yyyy
dllDirectory=c:/msys64/mingw32/bin
platlibdir=C:/msys64/mingw32/lib

static void initPy() {
  PyStatus status;
  PyConfig config;

  setEnv("pythonEnv.ini");
  // проблема: https://github.com/msys2/MINGW-packages/issues/18984
  AddDllDirectory(dllDirectory);
  AddDllDirectory(msys2Path);
  AddDllDirectory(platlibdir);
  AddDllDirectory(pythonEnv);
  //------------------------------
  // Устанавливает config.isolated в 1 и прочие параметры.
  // Но этого недостаточно само по себе.
  PyConfig_InitPythonConfig(&config);

  // Указывает явный путь к исполняемому файлу Python. Возвращает успешный
  // статус.
  status = PyConfig_SetString(&config, &config.home, msys2Path);
  if (PyStatus_Exception(status)) {
    printf("Не удалось установить HONE\n");
    goto exception;
  }

  status = PyConfig_SetString(&config, &config.platlibdir, platlibdir);
  if (PyStatus_Exception(status)) {
    printf("Не удалось установить platlibdir\n");
    goto exception;
  }

  status = PyConfig_SetString(&config, &config.pythonpath_env, pythonEnv);
  if (PyStatus_Exception(status)) {
    printf("Не удалось установить pythonpath_env\n");
    goto exception;
  }

  status = Py_InitializeFromConfig(&config);
  if (PyStatus_Exception(status)) {
    goto exception;
  }

  /* Считывает всю конфигурацию сразу */
  status = PyConfig_Read(&config);
  if (PyStatus_Exception(status)) {
    goto exception;
  }

  return;

exception:
  PyConfig_Clear(&config);
  PyErr_Print();
  /* Отображает сообщение об ошибке и завершают процесс с
     ненулевым кодом выхода */
  Py_ExitStatusException(status);
}

На msys2 все работает, но в оригинальной командной строке Windows происходит сбой.

У кого-нибудь есть идеи, как решить эту проблему?

Спасибо.

Ответ о том, как установить окружение.

Ответ или решение

Проблема, с которой вы столкнулись, связана с отсутствием библиотеки libpython3.dll при запуске вашего приложения в нативной среде Windows. Разберем шаги, которые могут помочь вам правильно настроить среду выполнения и решить эту проблему.

1. Проверка наличия библиотеки

Убедитесь, что файл libpython3.dll (или python311.dll, в зависимости от версии Python) действительно присутствует в каталоге C:/msys64/mingw32/bin. Если его нет, убедитесь, что вы правильно установили Python в среде MSYS2:

pacman -S mingw-w64-i686-python

2. Изменение алгоритма загрузки DLL

При запуске приложения из командной строки Windows, система не всегда знает, где искать нужные DLL. Вам нужно добавить в окружение переменную PATH, которая указывает на каталог, где находится libpython3.dll.

Вы можете сделать это следующим образом:

set PATH=C:\msys64\mingw32\bin;%PATH%

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

3. Добавление директорий DLL в коде

Поскольку вы уже используете AddDllDirectory() в своем коде, убедитесь, что пути указаны правильно. Иногда может быть полезно использовать прямые обратные слеши \\ вместо косых / в пути, хотя в большинстве случаев Windows корректно обрабатывает оба формата.

Пример изменения пути может выглядеть так:

AddDllDirectory("C:\\msys64\\mingw32\\bin");

4. Проверка конфигурации Python

Убедитесь, что переменные, которые вы передаете в PyConfig, корректны. Например, переменная msys2Path должна указывать на корректный путь до вашего интерпретатора Python в MSYS2.

5. Установка необходимых библиотек

Помимо libpython3.dll, убедитесь, что у вас установлены все необходимые зависимости. Например, если вы используете FFI (Foreign Function Interface), убедитесь, что также установлены нужные пакеты:

pacman -S mingw-w64-i686-libffi

6. Использование статической компоновки (опционально)

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

7. Отладка и тестирование

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

Если после этих шагов проблема не решается, пожалуйста, предоставьте дополнительную информацию о том, какие именно ошибки вы получаете, и мы постараемся помочь дальше.

Оцените материал
Добавить комментарий

Капча загружается...