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

Posted

技术标签:

【中文标题】如何使用 SWIG 在进程和调用脚本子进程之间共享库?【英文标题】:how to share a lib between process and called script subprocess using SWIG? 【发布时间】:2013-10-14 03:43:20 【问题描述】:

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

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

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

为此,我:

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

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

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

【问题讨论】:

所以第 1 部分和第 2 部分都在 C++ 中? 还定义了“只从 main 运行第一部分,从 python 运行第二部分”什么语言在做什么? 是的,第 1 部分和第 2 部分都使用 C++。但是,编写了相当于第 2 部分的 Python 脚本(每个 Python 命令最终将通过包装器调用等效的 C++ 方法)。 “仅运行...”已在上面进行了说明。 最简单的方法是包装第 1 部分,然后有一个 Python 脚本调用包装的第 1 部分,然后调用 Python 第 2 部分。这意味着程序以 Python 开头,而不是 C++。 C++ 条目是可能的,但完成起来更烦人。 【参考方案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++ 程序中。这是一个更加困难和复杂的过程,this answer has good info about how to get started。


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

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

【讨论】:

不,亚当,我很抱歉,但你似乎不明白我的问题。我确切地知道如何做你告诉我做的事情。我在问题开始时告诉过你。当您说“启动另一个进程”和“两个完全不同的程序”时,我很抱歉,这就是使用 共享​​> 库的全部意义 - 这就是为什么它应该由于 shared 库 .so,工作我正在尝试做的事情。它们应该允许在进程之间共享符号。 是的,我确实必须嵌入。是的,我不明白计算机是如何工作的(想想,我可能还是不明白)。谢谢亚当。

以上是关于如何使用 SWIG 在进程和调用脚本子进程之间共享库?的主要内容,如果未能解决你的问题,请参考以下文章

Python:在分叉的孩子和父母之间共享变量

在 C++ 中父进程和子进程之间共享队列

多处理:如何在多个进程之间共享一个字典?

进程和线程之间共享和更新列表

python在子进程之间共享单例对象

(待续)进程控制---父子进程之间的复制