Вопрос или проблема
Я пытаюсь запустить скрипт ниже в режиме отладки (в режиме 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. Вот шаги, которые помогут решить вашу проблему:
-
Проверьте правильность установки библиотек:
- Убедитесь, что вы используете правильные версии
python310_d.lib
иpython310_d.dll
, которые соответствуют версии Python, с которой вы работаете. Ваша версия Python должна быть компилирована в режиме отладки, поскольку Вы пытаетесь использовать отладочную версию библиотеки. - Установите все зависимости в вашем виртуальном окружении. Для этого выполните команду:
pip install numpy
- Убедитесь, что вы используете правильные версии
-
Путь к библиотекам:
- Убедитесь, что ваши настройки включают пути к библиотекам NumPy, которые находятся внутри виртуального окружения. Часто при использовании встраиваемого Python нужно установить переменную окружения
PYTHONPATH
в директорию, где находятся ваши установленные пакеты. Это можно сделать следующим образом:PyConfig_SetString(&config, &config.pathconfig, L"C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\Lib\\site-packages");
- Если пути к библиотекам указаны неправильно, Python не сможет найти необходимые модули, такие как
numpy._core._multiarray_umath
.
- Убедитесь, что ваши настройки включают пути к библиотекам NumPy, которые находятся внутри виртуального окружения. Часто при использовании встраиваемого Python нужно установить переменную окружения
-
Используйте полные пути:
- Вогда вызываете
PyRun_SimpleString
, рекомендуется использовать более безопасные методы, такие какPyRun_SimpleFile
, чтобы запускать полностью определённые скрипты, что может уменьшить вероятность ошибок.
- Вогда вызываете
-
Модули C-расширения:
- Некоторые ошибки могут быть следствием того, что NumPy пытается загрузить C-расширения, которые не могут быть загружены из неправильной директории. Убедитесь, что ваша программа запускается не из директории, где находится исходный код NumPy, а из директории, соответствующей виртуальному окружению.
-
Обработка ошибок:
- Кроме того, вы можете добавить больше логирования, чтобы отслеживать, что происходит после каждой операции:
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.