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

Posted

技术标签:

【中文标题】python在调试模式下在c ++中工作,但不在exe文件中【英文标题】:python works in c++ in debug mode, but not in exe file 【发布时间】:2019-03-04 02:56:39 【问题描述】:

我正在研究嵌入在 c++ helloworld 程序中的 Python 代码, 必要的附加包含/库目录已正确设置。

当我使用本地 Windows 调试器时,它会正确显示“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.py

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

【问题讨论】:

【参考方案1】:

在黑暗中拍摄:

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

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

这是脆弱的(可能没用):

sys.path.append('./')

你不知道当前目录是什么。最好使其与当前可执行文件相关,或者使用参数或环境变量进行配置。您可以使其相对于当前可执行文件,请参阅 Finding current executable's path without /proc/self/exe 或 Get 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;

【讨论】:

我添加了 throws 异常并将系统路径更改为绝对路径 sys.path.append('C:/project/'),并且单击 exe 的方法有效!!现在绝对路径有点糟糕,我希望用相对路径(“project.sln”的目录)替换它,但不知道如何。你能给我一些帮助吗? @TigerHu 见***.com/questions/1528298/get-path-of-executable。不幸的是,它并不漂亮。 也许尝试检查sys.executable 会起作用并以可移植的方式返回可执行文件名称。

以上是关于python在调试模式下在c ++中工作,但不在exe文件中的主要内容,如果未能解决你的问题,请参考以下文章

让请求在 curl 中工作,但不在 Python 中

Flutter(Web)提供程序不在发布模式下工作,但在调试中工作

import pyttsx在python 2.7中工作,但不在python3中

Jni java启动器在c中工作,但不在c++中

zcat 在命令行中工作,但不在 perl 脚本中

ApnsPHP:在开发中工作但不在生产中的推送通知