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
用于通讯。
我正在寻找比我想象的更好的可能性:
- 使用两个(rx 和 tx 通道)硬盘文件并将路径传递给两个文件作为参数。
- 使用本地套接字并传递路径作为参数。
- 使用内存映射文件和
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
对象具有三个描述属性:
-
fileno
- 一个手柄。 Unix 上的任意文件描述符和 Windows 上的套接字。
-
readable
- 一个布尔值,控制是否可以读取 Connection 对象。
-
writable
- 控制是否可以写入 Connection 对象的布尔值。
所有三个属性都可以作为对象属性访问,并且可以通过Connection
类构造函数。
看来如果:
- 进程调用
Pipe
生成一个子进程并共享connection.fileno()
number.
- 子进程创建一个
Connection
使用该文件描述符作为句柄的对象。
- 两个解释器都实现了
Connection
对象大致相同(我猜这是有风险的部分)。
有可能Connection.send
and Connection.recv
在这两个进程之间,尽管它们不共享相同的解释器构建,并且多处理模块实际上并未用于实例化子进程。
EDIT:
请注意Connection
类可用为multiprocessing.connection.Connection
在 python3 和 as 中_multiprocessing.Connection
在 python2 中(其中might建议不鼓励使用它。 YMMV)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)