如何使用 SWIG 在进程和调用的脚本子进程之间共享库
how to share a lib between process and called script subprocess using SWIG?
我有一个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
导入foobar1
和foobar2
,然后等效于第二部分
然后我尝试运行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
的事情。它的主要用途似乎是指出初学者程序员。
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 通过我的Python脚本中的子进程从c++中捕获cout
- 等待执行不可执行脚本的子进程