我目前正在做一个在我的网站中嵌入 Python 解释器的项目——我希望用户能够在安全的 Python 沙箱中的服务器端执行他们自己的 Python 代码。我一直在使用 PyPy 的沙盒功能,并将我的虚拟 tmp/ 目录(对应于沙盒可以读取的真实目录)设置为我的服务器端文件。因此,理想情况下,用户将能够在服务器上运行他们自己的代码并使用我提供给他们的任何库(无法写入任何这些文件/进行系统调用/做任何通常会弄乱我的文件的事情)。
问题是在我的服务器端代码中,我使用标准 Python 库以及我单独安装的其他库(例如“import datetime”、“import pandas”等)。虽然沙盒可以读取我的服务器端代码,但每当我尝试在此代码中导入其他库时,它最终都会失败。我曾想过将我的虚拟 tmp/ 目录设置为包含我的服务器端文件 + 标准 Python 库 + 单独安装的库,例如 PANDAS。但是,当我尝试将其设置为仅 Python 库时,它最终无法正常工作,更不用说这个解决方案似乎很不优雅。
关于如何解决这个问题的任何想法?我很感激任何人可能有的任何建议。谢谢!
编辑:我认为部分答案在于 pypy_interact.py 的以下部分(完整的源代码可以在这里找到:https ://github.com/ojii/sandlib/blob/master/sandlib/pypy_interact.py ):
def build_virtual_root(self):
# build a virtual file system:
# * can access its own executable
# * can access the pure Python libraries
# * can access the temporary usession directory as /tmp
exclude = ['.pyc', '.pyo']
if self.tmpdir is None:
tmpdirnode = Dir({})
else:
tmpdirnode = RealDir(self.tmpdir, exclude=exclude)
libroot = str(LIB_ROOT)
return Dir({
'bin': Dir({
'pypy-c': RealFile(self.executable),
'lib-python': RealDir(os.path.join(libroot, 'lib-python'),
exclude=exclude),
'lib_pypy': RealDir(os.path.join(libroot, 'lib_pypy'),
exclude=exclude),
}),
'tmp': tmpdirnode,
})
我对 Python 比较陌生,似乎无法弄清楚如何正确使用此方法。任何建议将不胜感激。