与修改后的 python 解释器进行进程间通信

2024-04-02

TL;DR:当 stdin/stdout 不可用时,如何生成不同的 python 解释器(从 python 内部)并在父级和子级之间创建通信通道?


我希望我的 python 脚本执行修改后的Python解释器并通过某种IPC,例如multiprocessing.Pipe与脚本通信that解释器运行。

假设我有类似以下内容的内容:

subprocess.Popen(args=["/my_modified_python_interpreter.exe",
                       "--my_additional_flag",
                       "my_python_script.py"])

它工作得很好,执行我的 python 脚本等等。

我现在想建立某种进程间通信使用修改后的 python 解释器。

理想情况下,我想分享类似于返回值之一的内容multiprocessing.Pipe(),但是我需要share该对象具有修改后的 python 进程(我怀疑multiprocessing.Pipe即使我这样做也不会处理得那么好)。

虽然发送文本和二进制文件就足够了(我不需要共享 python 对象或任何东西),但我确实需要它在所有主要操作系统(Windows、Linux、Mac)上都能运行。

更多用例/业务解释

更具体地说,修改后的解释器是IDAPython https://github.com/idapython/src附带的翻译器IDA https://www.hex-rays.com/products/ida/允许在 IDA 工具中编写脚本。

不幸的是,由于 stdio 已经大量用于现有的用户界面功能(由 IDA 提供),我无法使用stdin/stdout用于通讯。


我正在寻找比我想象的更好的可能性:

  1. 使用两个(rx 和 tx 通道)硬盘文件并将路径传递给两个文件作为参数。
  2. 使用本地套接字并传递路径作为参数。
  3. 使用内存映射文件和tagname在 Windows 上以及其他操作系统上的一些其他同步方法。

经过一番修补后multiprocessing.Pipe https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Pipe函数和multiprocesing.Connection https://docs.python.org/3/library/multiprocessing.html#multiprocessing.connection.Connection它返回的对象,我意识到序列化Connection对象比我最初想象的要简单得多。

A Connection对象具有三个描述属性:

  1. fileno- 一个手柄。 Unix 上的任意文件描述符和 Windows 上的套接字。
  2. readable- 一个布尔值,控制是否可以读取 Connection 对象。
  3. writable- 控制是否可以写入 Connection 对象的布尔值。

所有三个属性都可以作为对象属性访问,并且可以通过Connection类构造函数。

看来如果:

  1. 进程调用Pipe生成一个子进程并共享connection.fileno() number.
  2. 子进程创建一个Connection使用该文件描述符作为句柄的对象。
  3. 两个解释器都实现了Connection对象大致相同(我猜这是有风险的部分)。

有可能Connection.send and Connection.recv在这两个进程之间,尽管它们不共享相同的解释器构建,并且多处理模块实际上并未用于实例化子进程。

EDIT:

请注意Connection类可用为multiprocessing.connection.Connection在 python3 和 as 中_multiprocessing.Connection在 python2 中(其中might建议不鼓励使用它。 YMMV)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与修改后的 python 解释器进行进程间通信 的相关文章

随机推荐