使用修改后的 python 解释器进行进程间通信
Posted
技术标签:
【中文标题】使用修改后的 python 解释器进行进程间通信【英文标题】:Interprocess communication with a modified python interpreter 【发布时间】:2018-07-27 02:57:34 【问题描述】:TL;DR:当 stdin/stdout 不可用时,如何生成不同的 Python 解释器(从 Python 内部)并在父子之间创建通信通道?
我希望我的 python 脚本执行修改后的 python 解释器,并通过某种 IPC,例如 multiprocessing.Pipe
,与 解释器运行的脚本通信。 p>
假设我有类似以下内容:
subprocess.Popen(args=["/my_modified_python_interpreter.exe",
"--my_additional_flag",
"my_python_script.py"])
它工作得很好,可以执行我的 python 脚本和所有。
我现在想用修改后的 python 解释器设置某种进程间通信。
理想情况下,我想共享类似于 multiprocessing.Pipe()
的返回值之一的内容,但是我需要共享该对象与修改后的 python 进程(我怀疑 multiprocessing.Pipe
即使我这样做也不会处理得很好)。
虽然发送文本和二进制文件就足够了(我不需要共享 python 对象或任何东西),但我确实需要它在所有主要操作系统(windows、Linux、Mac)上都能正常工作。
更多用例/业务说明
更具体地说,修改后的解释器是IDA 附带的IDAPython 解释器,以允许在IDA 工具中编写脚本。
不幸的是,由于 stdio 已经大量用于现有的用户界面功能(由 IDA 提供),我无法使用stdin/stdout
进行通信。
我正在寻找比我想象的更好的可能性:
-
使用两个(rx 和 tx 通道)硬盘文件并将路径作为参数传递给这两个文件。
使用本地套接字并将路径作为参数传递。
在 Windows 上使用内存映射文件和
tagname
,在其他操作系统上使用其他同步方法。
【问题讨论】:
除非您解释修改的确切性质并显示您正在运行的脚本,否则很难为您提供帮助。最简单的做法可能是编写一个脚本,读取您通过管道输入的标准输入并输出适当的标准输出。 @MadPhysicist 我同意 特定修改 可能会使这项任务变得更加困难,但老实说,我认为这个问题代表了不同 python 解释器的一般情况。我能否请您对缺失的信息更具体一点?请注意我提到(现在解释)stdio 对我不可用。 我没有仔细阅读。这实际上是一个很好的问题。我被这家公司对修改过的口译员吓坏了。 谢谢。我会尝试编辑它。我可以看到这如何使问题变得比必要的困难。 【参考方案1】:在对multiprocessing.Pipe
函数和它返回的multiprocesing.Connection
对象进行了一些修改后,我意识到Connection
对象的序列化比我最初想象的要简单得多。
Connection
对象具有三个描述属性:
fileno
- 一个句柄。 Unix 上的任意文件描述符和 Windows 上的套接字。
readable
- 控制是否可以读取 Connection 对象的布尔值。
writable
- 控制是否可以写入 Connection 对象的布尔值。
所有三个属性都可以作为对象属性访问,并且可以通过Connection
类构造函数进行控制。
如果:
-
调用
Pipe
的进程生成一个子进程并共享connection.fileno()
编号。
子进程使用该文件描述符作为句柄创建一个Connection
对象。
两个解释器实现的 Connection
对象大致相同(我猜这是有风险的部分)。
Connection.send
和 Connection.recv
在这两个进程之间是可能的,尽管它们不共享相同的解释器构建,并且多处理模块实际上并未用于实例化子进程。
编辑:
请注意,Connection
类在 python3 中可用作 multiprocessing.connection.Connection
,在 python2 中可用作 _multiprocessing.Connection
(这可能表明不鼓励使用它。YMMV)
【讨论】:
只要连接只是底层系统方法的包装器,您可能不会遇到任何问题。【参考方案2】:使用the other answer of mine 原来是一个错误。由于在 Windows 上的 python2 中如何继承句柄,我无法在 Windows 机器上获得相同的解决方案。我最终使用了在多处理模块中也能找到的更高级的Listener
and Client
interfaces。
This question of mine 讨论了这个错误。
【讨论】:
以上是关于使用修改后的 python 解释器进行进程间通信的主要内容,如果未能解决你的问题,请参考以下文章