python在调试模式下以c ++工作,但不在exe文件中

问题描述 投票:2回答:1

我正在研究嵌入在c ++ hello world程序中的Python代码,正确设置了必要的附加include / library目录。

当我使用Local Windows Debugger时,它正确显示“Hello World”。但是,如果我双击project.exe,它说project.exe已停止工作。

有谁知道要做什么样的配置或步骤,以便project.exe双击时显示“Hello World”?

代码如下:

main.cpp中

#include <iostream>
#include <Python.h> 
#include <string.h>
#include <stdlib.h>
using namespace std;
int main() 
{ 
    Py_Initialize(); 
    PyRun_SimpleString("import sys");   
    PyRun_SimpleString("sys.path.append('./')");
    PyObject *pModule = PyImport_ImportModule("helloworld");
    PyObject *pFunc = PyObject_GetAttrString(pModule, "printHello");
    PyEval_CallObject(pFunc, NULL);
    Py_Finalize();
    return 0;
}

HelloWorld.朋友

def printHello():
   print("Hello World!")
python c++ python-c-api
1个回答
1
投票

在黑暗中拍摄:

  • 您没有检查调用的返回值,特别是返回指针的返回值
  • 使用调试器运行时不使用与“exe-click”方法相同的目录

你应该检查pModule的返回值。我的猜测是,因为你在一个不同的目录,导入失败,所以PyImport_ImportModule函数返回NULL(python引发异常,但不在此上下文中,因为这是一个有其局限性的C API)

这很脆弱(也可能没用):

sys.path.append('./')

您不知道当前目录是什么。最好使其相对于当前可执行文件,或使用参数或环境变量进行配置。您可以将其设置为相对于当前可执行文件,请参阅Finding current executable's path without /proc/self/exeGet path of executable

现在,当您尝试使用此空指针时,程序崩溃。从这开始:

PyObject *pModule = PyImport_ImportModule("helloworld");
if (pModule == NULL)
{
   std::cout << "could not import module\n";
   exit(1);
}

(同样适用于属性获取:始终保护您的调用,或者更好:将它们包装在抛出异常的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;
}
© www.soinside.com 2019 - 2024. All rights reserved.