在沙盒Pypy中使用套接字模块

时间:2011-07-11 19:18:02

标签: python sockets sandbox pypy

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

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

我正在努力做到可行吗?如果是这样,我如何导入套接字模块?如果没有,我还能做什么?

1 个答案:

答案 0 :(得分:4)

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

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

  1. 直接使用os.open,文件名以tcp://开头。这实际上非常有效,是我最喜欢的方法。
  2. 实施您自己的socket库。这当然不是优选的,但我相信可以创建一个相对空的套接字库,它只是简单地与沙箱控制器通信,如上所述包装套接字功能。甚至可以修改默认套接字库来实现此目的(例如,不包括_socket)。