6

我正在尝试允许使用 Pypy 沙盒化的子进程使用有限的协议与父进程进行通信。

在查看了 Pypy 包含的源代码后pypy/pypy/translator/sandbox/sandlib.py,似乎有一个VirtualizedSocketProc允许os.open调用打开套接字。我更改了代码的一些功能(例如,允许有限端口上的 TCP 连接),但几乎没有更改。但是,我无法实际导入 Pypy 的socket模块,因为它需要一个不存在的_socket模块,该模块似乎位于代码的解释器级部分。

我正在尝试做的事情可行吗?如果是这样,我如何导入套接字模块?如果没有,我还能做什么?

4

1 回答 1

4

我对此进行了进一步调查,看来这是一个相当基本的问题。socket在库级别(目录内部)实现的模块lib本质上是_socket库的空外壳,它是pypy/module目录中定义的解释器级别模块。对于不熟悉 PyPy 的人来说,可以导入的模块有两种,大致对应于 CPython 中的纯 Python 和 C 库。在库级别实现的模块可以很容易地包含在沙箱中,实际上包含在“默认”pypy_interact沙箱中。但是,在解释器级别编写的模块在沙箱中不可用。

由于这种关键的区别,我的方法似乎存在根本性的缺陷。相反,如果您遇到同样的问题,您可以考虑其他一些选项:

  1. 直接使用以 .os.open开头的文件名tcp://。这实际上效果很好,是我最喜欢的方法。
  2. 实现你自己的socket库。这当然不是可取的,但我相信可以创建一个相对空的套接字库,它只是与上面的沙盒控制器通信,封装了套接字功能。甚至可以修改默认套接字库来实现这一点(_socket例如,不包括 )。
于 2011-07-14T21:48:28.807 回答