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
进行通信。
我正在寻找比我想到的更好的可能性:
stdin/stdout
,在其他OS上使用其他同步方法。答案 0 :(得分:0)
在修改了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)< / p>
答案 1 :(得分:0)
与angular-strap一起使用是错误的。由于在Windows上的python2中是如何继承句柄的,因此无法在Windows机器上使用相同的解决方案。我最终使用了在多处理模块中也可以找到的更高级的the other answer of mine。
Listener
and Client
interfaces我的问题讨论了这个错误。