Как запустить C++ приложение с встроенным Python в режиме отладки

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

Я пытаюсь запустить скрипт ниже в режиме отладки (в режиме Release всё работает нормально). Я связал свою программу с python310_d.lib и python310_d.dll, которые были собраны из исходного кода, найденного здесь https://github.com/python/cpython/tree/3.10, и вручную переместил в папки C:\Users\rizzo\AppData\Local\Programs\Python\Python310 и \libs. Я использую python.exe из моего виртуального окружения, поэтому он должен автоматически обнаруживать библиотеки.

#define PY_SSIZE_T_CLEAN
#include <Python.h>

#include <iostream>
#include <vector>
#include <string>
#include <stdio.h> 
#include <locale>
#include <codecvt>

int main(){
    
    PyConfig config;
    PyConfig_InitIsolatedConfig(&config);

    auto venv_executable = L"C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\Scripts\\python.exe";
    PyConfig_SetString(&config, &config.executable, venv_executable);

    auto status = Py_InitializeFromConfig(&config);
    PyConfig_Clear(&config);

    if (PyStatus_Exception(status)) {
        std::cout << "status.func: " << (status.func ? status.func : "N/A") << '\n';
        std::cout << "status.err_msg: " << (status.err_msg ? status.err_msg : "N/A") << '\n';
    }
    
    PyRun_SimpleString("import numpy; print(\"Hello World! :33333\")");
  
    return 0;
}

Вот ошибка, которую я получаю:

Traceback (most recent call last):
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\__init__.py", line 23, in <module>
    from . import multiarray
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\multiarray.py", line 10, in <module>
    from . import overrides
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\overrides.py", line 8, in <module>
    from numpy._core._multiarray_umath import (
ModuleNotFoundError: No module named 'numpy._core._multiarray_umath'

Во время обработки вышеуказанного исключения возникло другое исключение:

Traceback (most recent call last):
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\__init__.py", line 128, in <module>
    from numpy.__config__ import show as show_config
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\__config__.py", line 4, in <module>
    from numpy._core._multiarray_umath import (
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\__init__.py", line 49, in <module>
    raise ImportError(msg)
ImportError:

ВАЖНО: ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ЭТО ДЛЯ СОВЕТОВ ПО РЕШЕНИЮ ЭТОЙ ПРОБЛЕМЫ!

Ошибка импорта C-расширений numpy. Эта ошибка может возникнуть по
многим причинам, часто из-за проблем с вашей конфигурацией или тем, как был установлен NumPy.

Мы собрали некоторые общие причины и советы по устранению неполадок по адресу:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Пожалуйста, обратите внимание и проверьте следующее:

  * Версия Python: Python3.10 из "C:\Users\rizzo\Desktop\TESI\MMM_env\Scripts\python.exe"
  * Версия NumPy: "2.1.1"

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

Исходная ошибка: Нет модуля с именем 'numpy._core._multiarray_umath'


Вышеуказанное исключение было прямой причиной следующего исключения:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\__init__.py", line 133, in <module>
    raise ImportError(msg) from e
ImportError: Ошибка импорта numpy: вы не должны пытаться импортировать numpy из
        его исходного каталога; пожалуйста, выйдите из дерева исходников numpy и перезапустите
        ваш интерпретатор python оттуда.

C:\Users\rizzo\Desktop\TESI\dependencies_test\build\Debug\python_cpp.exe (процесс 15864) завершился с кодом 0 (0x0).
Чтобы автоматически закрыть консоль при остановке отладки, включите в Tools->Options->Debugging->Automatically close the console when debugging stops.
Нажмите любую клавишу, чтобы закрыть это окно. . .

Есть идеи? Спасибо!

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

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

  1. Проверьте правильность установки библиотек:

    • Убедитесь, что вы используете правильные версии python310_d.lib и python310_d.dll, которые соответствуют версии Python, с которой вы работаете. Ваша версия Python должна быть компилирована в режиме отладки, поскольку Вы пытаетесь использовать отладочную версию библиотеки.
    • Установите все зависимости в вашем виртуальном окружении. Для этого выполните команду:
      pip install numpy
  2. Путь к библиотекам:

    • Убедитесь, что ваши настройки включают пути к библиотекам NumPy, которые находятся внутри виртуального окружения. Часто при использовании встраиваемого Python нужно установить переменную окружения PYTHONPATH в директорию, где находятся ваши установленные пакеты. Это можно сделать следующим образом:
      PyConfig_SetString(&config, &config.pathconfig, L"C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\Lib\\site-packages");
    • Если пути к библиотекам указаны неправильно, Python не сможет найти необходимые модули, такие как numpy._core._multiarray_umath.
  3. Используйте полные пути:

    • Вогда вызываете PyRun_SimpleString, рекомендуется использовать более безопасные методы, такие как PyRun_SimpleFile, чтобы запускать полностью определённые скрипты, что может уменьшить вероятность ошибок.
  4. Модули C-расширения:

    • Некоторые ошибки могут быть следствием того, что NumPy пытается загрузить C-расширения, которые не могут быть загружены из неправильной директории. Убедитесь, что ваша программа запускается не из директории, где находится исходный код NumPy, а из директории, соответствующей виртуальному окружению.
  5. Обработка ошибок:

    • Кроме того, вы можете добавить больше логирования, чтобы отслеживать, что происходит после каждой операции:
      if (status != PyStatus_OK) {
       std::cerr << "Ошибка инициализации Python: " << (status.err_msg ? status.err_msg : "N/A") << std::endl;
       return 1;
      }

Вот как будет выглядеть обновлённый код с исправлениями:

#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h> 
#include <locale>
#include <codecvt>

int main() {
    PyConfig config;
    PyConfig_InitIsolatedConfig(&config);

    auto venv_executable = L"C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\Scripts\\python.exe";
    PyConfig_SetString(&config, &config.executable, venv_executable);

    // Добавить путь к site-packages
    PyConfig_SetString(&config, &config.pathconfig, L"C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\Lib\\site-packages");

    auto status = Py_InitializeFromConfig(&config);
    PyConfig_Clear(&config);

    if (PyStatus_Exception(status)) {
        std::cout << "Ошибка: " << (status.err_msg ? status.err_msg : "N/A") << '\n';
        return 1; // Завершаем программу с ошибкой
    }

    // Запуск Python-кода
    status = PyRun_SimpleString("import numpy; print(\"Hello World! :33333\")");
    if (PyStatus_Exception(status)) {
        std::cout << "Ошибка выполнения: " << (status.err_msg ? status.err_msg : "N/A") << '\n';
        return 1;
    }

    return 0;
}

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

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

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