我正在尝试允许使用Pypy沙箱的子进程使用有限协议与父进程进行通信。
在审核了Pypy中包含的pypy/pypy/translator/sandbox/sandlib.py
的源代码后,似乎有VirtualizedSocketProc
允许os.open
调用打开套接字。我已经改变了代码的一些功能(例如,允许在有限端口上进行TCP连接),但很少有变化。但是,我无法实际导入Pypy的socket
模块,因为它需要一个不存在的_socket
模块,该模块似乎位于代码的解释器级部分。
我正在努力做到可行吗?如果是这样,我如何导入套接字模块?如果没有,我还能做什么?
答案 0 :(得分:4)
我对此进行了进一步调查,看来这是一个相当基本的问题。在库级别(socket
目录内部)实现的lib
模块本质上是_socket
库的空shell,它是pypy/module
库中定义的解释器级模块。 {1}}目录。对于那些不熟悉PyPy的人来说,有两种类型的模块可以导入,大致对应于CPython中的纯Python和C库。在库级别实现的模块可以轻松地包含在沙箱中,实际上包含在“默认”pypy_interact
沙箱中。但是,在解释器级别编写的模块在沙箱中不可用。
由于这种至关重要的区别,我的方法似乎存在基本的缺陷。相反,如果您遇到同样的问题,还可以考虑其他一些选项:
os.open
,文件名以tcp://
开头。这实际上非常有效,是我最喜欢的方法。socket
库。这当然不是优选的,但我相信可以创建一个相对空的套接字库,它只是简单地与沙箱控制器通信,如上所述包装套接字功能。甚至可以修改默认套接字库来实现此目的(例如,不包括_socket
)。