Python在c++中的debug模式下工作,但在exe文件中却不起作用

2024-09-29 22:44:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个嵌入c++helloworld程序的Python代码, 正确设置必要的附加include/library目录。你知道吗

当我使用本地Windows调试器时,它会正确地显示“helloworld”。 但是如果我双击项目.exe上面说项目.exe已停止工作。

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

代码如下所示:

你知道吗主.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;
}

你知道吗你好世界.py你知道吗

def printHello():
   print("Hello World!")

Tags: 项目代码pyhelloworldincludesyspyrun
1条回答
网友
1楼 · 发布于 2024-09-29 22:44:07

在黑暗中拍摄:

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

您应该检查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;
}

相关问题 更多 >

    热门问题