我正在用python编写代码,这些代码可能会疯狂运行并做出意想不到的事情。这可能包括尝试将非常大的阵列保存到磁盘,以及尝试为阵列分配大量内存(超过系统上的物理可用内存)。
我想在Mac OSX 10.7.5中的受限环境中使用以下规则运行代码:
- 该程序可以将文件写入一个特定目录,而不能写入其他目录(即,它不能修改该目录之外的文件,但可以从外部读取文件)
- 该目录具有最大"容量",因此程序无法保存价值千兆字节的数据
- 程序只能分配有限的内存
有人对如何建立这样一个受控的环境有什么想法吗?
谢谢。
导入
stats=os.stat('possibly_big_file.txt')
if(stats.strongize>TOOBIG):
打印"哦,不……"
一个简单而天真的解决方案,可以扩展以实现您想要的:
WRITABLE_DIRECTORY = '/full/path/to/writable/directory'
class MaxSizeFile(object):
def __init__(self, fobj, max_bytes=float('+inf')):
self._fobj = fobj
self._max = max_bytes
self._cur = 0
def write(self, data):
# should take into account file position...
if self._cur + len(data) > self._max:
raise IOError('The file is too big!')
self._fobj.write(data)
self._cur += len(data)
def __getattr__(self, attr):
return getattr(self._fobj, attr)
def my_open(filename, mode='r', ..., max_size=float('+inf')):
if '+' in mode or 'w' in mode:
if os.path.dirname(filename) != WRITABLE_DIRECTORY:
raise OSError('Cannot write outside the writable directory.')
return MaxSizeFile(open(filename, mode, ...), max_size)
然后,使用内置的open
,您可以调用my_open
。阵列也可以这样做。不是直接分配数组,而是调用一个函数来跟踪分配了多少内存,并最终引发异常。
显然,这只提供了很轻的约束,但如果程序不是为了引起问题而编写的,那就足够了。