0

我有一个 C++ 程序foobar,它从开始,main()然后控制流通过第一部分,然后是程序的第二部分。如果我更改mainfoobar_main,我可以将整个程序和一个 SWIG Python 包装器编译到一个共享库foobar.so中,然后将其导入 Python,foobar_main从 Python 中调用,一切正常。

第二部分通过一些可敬的 C++ 结构与第一部分进行通信。具体来说:第一部分创建一些类的一些单个对象,第二部分使用类静态方法来获取这些对象。

现在我只想main()从 Python 运行第一部分和第二部分。也就是说,我想启动 C++ 程序foobar,然后在第一部分完成后,运行 Python 脚本(在 C++ 中以编程方式),然后继续第二部分。

为此,我:

  • 编译第二部分和一个 SWIG 包装器foobar2.so
  • 将 C++ 代码的第二部分替换为system("python foobar2.py")
  • 将修改后的 C++ 程序编译到foobar1.so并加载到foobar
  • foobar2.py编写导入的脚本foobar1foobar2然后等效于第二部分

然后我尝试运行foobar。它不起作用,因为看起来第二部分中的例程抱怨某些应该在第一部分中完成的步骤没有完成。

这很尴尬,但显然我在理解计算机如何工作方面存在一些深刻的缺陷:) 有人能告诉我我所缺少的东西,包括可能简化上述过程吗?

4

1 回答 1

1

我将假设您的 C++ 代码如下所示:

void part1()
{}

void part2()
{}

int main()
{
    part1();
    part2();
}

你有一个 Python 版本,part2()它是用其他一些包装的 C++ 函数实现的。如果这些假设是错误的,请告诉我。

我认为最简单的方法是part1()与其他包装的 part2 相关函数一起包装,然后有一个这样的 Python 脚本:

import foobar

foobar.part1()
py_part2()

这当然意味着程序以 Python 启动。如果您出于某种原因需要启动 C++ 程序(即您需要main()),那么为了使用py_part2(),您必须将 Python 解释器嵌入到您的 C++ 程序中。这是一个更加困难和复杂的过程,这个答案有很好的关于如何开始的信息


既然你正在学习,我会解释为什么system("python foobar2.py")不起作用。在这个方案中,您的 C++ 程序启动另一个名为 的进程(程序),python然后等待它完成。这是两个完全不同的程序,在您的情况下,它们不相互交谈,也不共享任何共同点。因此为什么它不起作用。

一般来说,重新考虑任何涉及system. 它的主要用途似乎是指出初学者程序员。

于 2013-10-14T05:34:00.690 回答