Выстрел в темноте:
- Вы не проверяете возвращаемые значения для своих вызовов, особенно те, которые возвращают указатели
- , работающие с отладчиком, не используют то же самоекаталог как метод exe-click
, вы должны проверить возвращаемое значение pModule
.Я предполагаю, что, поскольку вы находитесь в другом каталоге, импорт завершается неудачно, поэтому функция PyImport_ImportModule
возвращает NULL
(python вызывает исключения, но не в этом контексте, поскольку это C API с его ограничениями)
Это хрупко (и, возможно, бесполезно):
sys.path.append('./')
Вы не знаете, что такое текущий каталог.Было бы лучше сделать его относительно текущего исполняемого файла или настроить с помощью аргумента или переменной среды.Вы можете сделать это относительно текущего исполняемого файла, см. Поиск пути к текущему исполняемому файлу без / proc / self / exe или Получить путь к исполняемому файлу
Теперь, когда вы пытаетесьчтобы использовать этот нулевой указатель, программа падает.Начните с этого:
PyObject *pModule = PyImport_ImportModule("helloworld");
if (pModule == NULL)
{
std::cout << "could not import module\n";
exit(1);
}
(то же самое относится и к атрибуту fetch: всегда защищайте свои вызовы или, что лучше: оберните их в метод C ++, который генерирует исключения).
#include <string>
#include <stdexcept>
PyObject *safe_PyImport_ImportModule(const std::string &module_name)
{
PyObject *pModule = PyImport_ImportModule(module_name.c_str());
if (pModule == NULL) // c++11 purists would put "nullptr"
{
std::cout << "cannot import " << module_name << '\n';
throw std::runtime_error("Import error: "+module_name);
}
return pModule;
}