Python 透视代理可以通过stdio而不是TCP使用吗?

Python 透视代理可以通过stdio而不是TCP使用吗?,python,twisted,perspective-broker,Python,Twisted,Perspective Broker,我使用Twisted的透视代理在流程和子流程之间进行RMI 我宁愿使用子进程的stdin和stdout,而不是侦听TCP套接字(例如通过传递reactor.listenTCP()PBServerFactory的实例)并让子进程连接到它 我发现twisted.internet.stdio.StandardIO,但如果是这样的话,我不知道如何设置一切 在stdio上使用PB而不是TCP是否可行?怎么做 等等,为什么? 子进程用于运行不受信任的代码。它是沙盒式的,但需要能够以有限的方式与父进程通信。

我使用Twisted的透视代理在流程和子流程之间进行RMI

我宁愿使用子进程的stdin和stdout,而不是侦听TCP套接字(例如通过传递
reactor.listenTCP()
PBServerFactory的实例)并让子进程连接到它

我发现twisted.internet.stdio.StandardIO,但如果是这样的话,我不知道如何设置一切

在stdio上使用PB而不是TCP是否可行?怎么做


等等,为什么? 子进程用于运行不受信任的代码。它是沙盒式的,但需要能够以有限的方式与父进程通信。某种形式的RMI是到目前为止针对特定用例最干净的选择,PB有一个看起来正确的访问模型。但是沙盒进程没有——也不应该需要——网络访问。RMI是其与外部世界的唯一通信,通过stdin/stdout进行传输似乎是一种干净的业务方式


但是,如果我没有用正确的方法来解决这个问题,这也是一个完全正确的答案。

在类似stdio的连接上,在父进程和子进程之间使用类似PB的协议有两个部分。子进程中有一个片段,使用文件描述符0和1与父进程通信。另一部分是父进程,使用与子进程的0和1相对应的任何文件描述符

StandardIO
是第一件。您仍然需要第二部分,即
IReactorProcess.spawnProcess

但是,较新的端点API是访问此功能的更好方法

端点的基础是,客户端端点允许您连接到服务器,而不必关心连接是如何建立的;服务器端点允许您接受来自客户端的连接,而不必关心这些客户端是如何连接的

有一个子进程客户端终结点和一个stdio服务器终结点。这意味着您可以编写类似以下内容的客户端:

factory = PBClientFactory(...)
d = factory.getRootObject()
...

clientEndpoint.connect(factory)
factory = PBServerFactory(...)
...
serverEndpoint.listen(factory)
您的服务器类似于:

factory = PBClientFactory(...)
d = factory.getRootObject()
...

clientEndpoint.connect(factory)
factory = PBServerFactory(...)
...
serverEndpoint.listen(factory)
现在您有了一个客户机和服务器,它们将相互通信,但您还没有指定它们如何相互通信。也许是TCP或者是stdio

然后,您只需要选择要使用的正确端点。要坚持通过stdio进行沟通的想法:

clientEndpoint = ProcessEndpoint(reactor, "/path/to/child", ("argv",), ...)
serverEndpoint = StandardIOEndpoint(reactor)
如果您以后改变主意,那么切换到-say-TCP非常简单:

clientEndpoint = TCP4ClientEndpoint(reactor, "1.2.3.4", 12345)
serverEndpoint = TCP4ServerEndpoint(reactor, 12345)
或者,您可以使用端点字符串描述的插件机制将其转换为配置:

clientEndpoint = clientFromString(reactor, options["client-endpoint"])
serverEndpoint = serverFromString(reactor, options["server-endpoint"])
其中
options[“client endpoint”]
options[“server endpoint”]
是类似于
“tcp:host=1.2.3.4:port=12345”
“tcp:port=12345”
的字符串

有关更多信息,请参阅