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

时间:2018-07-27 02:57:34

标签: python multiprocessing ipc

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


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

让我们说我有类似以下内容的东西:

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

可以正常工作,并且可以执行我的python脚本及所有程序。

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

理想情况下,我想共享与multiprocessing.Pipe()返回的值之一相似的内容,但是我需要使用修改后的python进程 share (并且我怀疑{ {1}}不能很好地解决这个问题。

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

更多用例/业务说明

更具体地说,修改后的解释器是IDAPython附带的IDA解释器,允许在IDA工具中编写脚本。

不幸的是,由于stdio已经被现有的用户界面功能(由IDA提供)大量使用,因此我无法使用multiprocessing.Pipe进行通信。


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

  1. 使用两个(rx和tx通道)硬盘文件并将两个路径都作为参数传递。
  2. 使用本地套接字,并将路径作为参数传递。
  3. 在Windows上使用内存映射文件和stdin/stdout,在其他OS上使用其他同步方法。

2 个答案:

答案 0 :(得分:0)

在修改了multiprocessing.Pipe函数和它返回的multiprocesing.Connection对象之后,我意识到Connection对象的序列化比我最初想象的要简单得多。

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

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

这三个属性都可以作为对象属性访问,并且可以通过Connection类构造函数进行控制。

看来,如果:

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

这两个进程之间可能Connection.sendConnection.recv之间共享,尽管它们不共享相同的解释器版本,并且实际上未使用多处理模块来实例化子进程。

编辑:

请注意,Connection类在python3中可作为multiprocessing.connection.Connection使用,在python2中可作为_multiprocessing.Connection使用(可能建议不要使用它。YMMV)< / p>

答案 1 :(得分:0)

angular-strap一起使用是错误的。由于在Windows上的python2中是如何继承句柄的,因此无法在Windows机器上使用相同的解决方案。我最终使用了在多处理模块中也可以找到的更高级的the other answer of mine

Listener and Client interfaces我的问题讨论了这个错误。