如何使用 SWIG 在进程和调用的脚本子进程之间共享库

how to share a lib between process and called script subprocess using SWIG?

本文关键字:子进程 脚本 之间 共享 调用 SWIG 何使用 进程      更新时间:2023-10-16

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

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

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

为此,我:

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

然后我尝试运行foobar. 这是行不通的,因为第二部分中的例程似乎抱怨第一部分中应该完成的某些步骤没有完成。

这很令人着迷,但显然我在理解计算机如何工作方面存在一些深刻的缺陷:)有人可以告诉我我错过了什么,包括可能简化上述过程吗?

我假设你的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的事情。它的主要用途似乎是指出初学者程序员。