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

2024-01-24

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

当我使用本地 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;
}

你好世界.py

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

在黑暗中拍摄:

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

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

这是脆弱的(并且可能无用):

sys.path.append('./')

您不知道当前目录是什么。最好使其与当前可执行文件相关,或者使用参数或环境变量进行配置。您可以使其相对于当前的可执行文件,请参阅在没有 /proc/self/exe 的情况下查找当前可执行文件的路径 https://stackoverflow.com/questions/1023306/finding-current-executables-path-without-proc-self-exe or 获取可执行文件的路径 https://stackoverflow.com/questions/1528298/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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python在调试模式下可以在c++中工作,但不能在exe文件中工作 的相关文章

随机推荐

  • 应用程序置于后台时获取错误

    我的 RN 应用程序遇到了问题 想知道是否有人遇到过这个问题以及他们是如何解决的 在 fetch 调用期间 如果用户将应用程序置于后台并返回 则 fetch 始终会出错 catch 块 如果您对此问题还有其他疑问 请告诉我 最近陷入这个问题
  • PHP Codeigniter 中的自定义验证 - 必填的两个字段之一

    我的表单有一个手机和一个电话字段 我希望用户填写其中一个字段或两个字段 但不能两者都填写 我已经看到了用其他语言实现此目的的方法 但是我可以提供一些关于如何使用 Codeigniter 实现此目的的建议吗 你可以这样做 this gt fo
  • 如何引用 Visual Studio 2013 的 NewProjectDialog 颜色的 BrushKey/ColorKey?

    基本上 我正在创建一个带有对话框的 VS2013 扩展 该对话框应具有与 新建项目 添加项目 对话框相同的布局和颜色 它是一个对话框 在左侧窗格中显示代码生成模板 并在中间窗格中显示当前解决方案中类型的树形视图 让我最高兴的是 我找到了Mi
  • 如何用Java计算圆内各点的坐标?

    I found 这个网站 http vladgotlib com circular 你尝试画一个完美的圆 只是为了好玩 我编写了这个小型 Java 应用程序 它从屏幕中间绘制一个圆圈 here is my massive array pri
  • 为什么ELF的vaddr没有页面对齐?

    我正在尝试构建一个类似 xv6 的系统 并且我正在复制下面的 xv6 代码 if ph p vaddr PGSIZE cprintf exec addr not page aligned n goto bad 这是ELF被加载到内存的部分
  • 如何在 Firefox for Android 中检测 Android 的版本号?

    对于网站 如果用户使用 Android 4 设备 我们希望在 Play 商店中显示链接 我们测试的所有浏览器都在其用户代理字符串中发送 Android 版本号 除了 Firefox for Android Firefox 只是发送这个 Mo
  • 如何检查 mac bash 应用程序启动时是否按下了选项键

    我有一个相对简单的问题 我有一些 Mac 应用程序 其启动器是用 bash 编写的 我想向启动器添加一个小功能 让其他人在应用程序启动时按下 option alt 键时访问 config app 或位于 Contents Resources
  • SQL 更新查询中的聚合函数?

    我试图将一个表中的值设置为另一表中的值的总和 沿着这些思路 UPDATE table1 SET field1 SUM table2 field2 FROM table1 INNER JOIN table2 ON table1 field3
  • 如何通过 web3 或 json rpc 获取 solana 链上所有 Candy Machine Id

    我想通过 web3 或 json rpc 调用获取链上的所有 Candy Machine Id 我已尝试使用 getProgramAccounts json rpc 但已达到最大响应大小的响应 这是我尝试过的代码 curl http api
  • 如何从 Xamarin(Android 和 iOS)使用 OpenCV?

    我想使用 Xamarin 创建一个适用于 iOS 和 Android 的移动应用程序 并且我想调用一些 OpenCV 函数 例如 轮廓检测和透视变换 我大致了解从 C 调用 C 函数的过程 但我不知道如何从OpenCV 二进制文件 http
  • Velocity:如何定义全局变量

    我尝试添加一堆 set x abc VM global library vm 文件中的语句 但这些变量在我的 VM 模板中不可用 我想为图像的基本路径等设置一个全局变量 这可能吗 您可以将该变量添加到 VelocityContext 然后它
  • 如何在 SQL 中用随机数填充列?我在每一行中得到相同的值

    UPDATE CattleProds SET SheepTherapy ROUND RAND 10000 0 WHERE SheepTherapy IS NULL 如果我然后执行选择 我会看到我的随机数是每行都相同 http xkcd co
  • EF Core - 添加相关实体时出错

    当我尝试更新已从数据库获取的实体的相关实体时 出现错误 为了便于说明 我有这些实体 class Car int Id string Name virtual ICollection
  • static_assert if 表达式为 constexpr

    我想创建一个类模板 template
  • ViewComponents 不是异步的

    我正在尝试使用ViewComponents InvokeAsync 功能 但不知怎的 这根本不是异步的 它正在等待组件代码渲染 http docs asp net en latest mvc views view components ht
  • Visual Studio 2008 - 获取断点之间的时间间隔?

    有谁知道VS 2008中能否得到破发点之间的时间间隔 插件 VS技巧 我不想将代码添加到现有的源代码中来计算运行需要多长时间 我想要一种快速而肮脏的方法来在调试时获取它 对于你们这些聪明的人来说 我知道我也可以随时拿出秒表 但我也想要一些稍
  • 如何在 C# 中按日期时间对集合进行排序

    我有一个需要按日期时间排序的列表 MyStuff 类如下所示 public class MyStuff public int Type get set public int Key get set public DateTime Creat
  • linq用or条件连接3个表

    我需要在 LINQ 中创建一个包含 3 个表和 OR 条件的语句 我的函数接收一个整数 让我们调用它intZ 我有3张桌子 tableA tableB and tableC tableA有列int1 int2 and intB intB与t
  • Powershell 启动进程 VS 调用项

    有什么区别Start Process and Invoke Item 我注意到你不能Invoke Item chrome 我假设Invoke Item专门针对具有给定文件路径的文件 但是使用有什么好处吗Invoke Item代替Start
  • python在调试模式下可以在c++中工作,但不能在exe文件中工作

    我正在研究将 Python 代码嵌入到 C helloworld 程序中 正确设置必要的附加包含 库目录 当我使用本地 Windows 调试器时 它正确显示 Hello World 但如果我双击project exe 它会说project