mirror of
https://github.com/open-compass/opencompass.git
synced 2025-05-30 16:03:24 +08:00
188 lines
5.0 KiB
Python
188 lines
5.0 KiB
Python
![]() |
# The MIT License
|
||
|
#
|
||
|
# Copyright (c) OpenAI (https://openai.com)
|
||
|
#
|
||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
# of this software and associated documentation files (the "Software"), to deal
|
||
|
# in the Software without restriction, including without limitation the rights
|
||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
# copies of the Software, and to permit persons to whom the Software is
|
||
|
# furnished to do so, subject to the following conditions:
|
||
|
#
|
||
|
# The above copyright notice and this permission notice shall be included in
|
||
|
# all copies or substantial portions of the Software.
|
||
|
#
|
||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
# THE SOFTWARE.
|
||
|
|
||
|
import contextlib
|
||
|
import faulthandler
|
||
|
import io
|
||
|
import os
|
||
|
import platform
|
||
|
import signal
|
||
|
import tempfile
|
||
|
from typing import Optional
|
||
|
|
||
|
|
||
|
@contextlib.contextmanager
|
||
|
def swallow_io():
|
||
|
stream = WriteOnlyStringIO()
|
||
|
with contextlib.redirect_stdout(stream):
|
||
|
with contextlib.redirect_stderr(stream):
|
||
|
with redirect_stdin(stream):
|
||
|
yield
|
||
|
|
||
|
|
||
|
@contextlib.contextmanager
|
||
|
def time_limit(seconds: float):
|
||
|
def signal_handler(signum, frame):
|
||
|
raise TimeoutException("Timed out!")
|
||
|
|
||
|
signal.setitimer(signal.ITIMER_REAL, seconds)
|
||
|
signal.signal(signal.SIGALRM, signal_handler)
|
||
|
try:
|
||
|
yield
|
||
|
finally:
|
||
|
signal.setitimer(signal.ITIMER_REAL, 0)
|
||
|
|
||
|
|
||
|
@contextlib.contextmanager
|
||
|
def create_tempdir():
|
||
|
with tempfile.TemporaryDirectory() as dirname:
|
||
|
with chdir(dirname):
|
||
|
yield dirname
|
||
|
|
||
|
|
||
|
@contextlib.contextmanager
|
||
|
def chdir(root):
|
||
|
if root == ".":
|
||
|
yield
|
||
|
return
|
||
|
cwd = os.getcwd()
|
||
|
os.chdir(root)
|
||
|
try:
|
||
|
yield
|
||
|
except BaseException as exc:
|
||
|
raise exc
|
||
|
finally:
|
||
|
os.chdir(cwd)
|
||
|
|
||
|
|
||
|
class TimeoutException(Exception):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class WriteOnlyStringIO(io.StringIO):
|
||
|
"""StringIO that throws an exception when it's read from"""
|
||
|
|
||
|
def read(self, *args, **kwargs):
|
||
|
raise IOError
|
||
|
|
||
|
def readline(self, *args, **kwargs):
|
||
|
raise IOError
|
||
|
|
||
|
def readlines(self, *args, **kwargs):
|
||
|
raise IOError
|
||
|
|
||
|
def readable(self, *args, **kwargs):
|
||
|
"""Returns True if the IO object can be read."""
|
||
|
return False
|
||
|
|
||
|
|
||
|
class redirect_stdin(contextlib._RedirectStream): # type: ignore
|
||
|
_stream = "stdin"
|
||
|
|
||
|
|
||
|
def reliability_guard(maximum_memory_bytes: Optional[int] = None):
|
||
|
"""
|
||
|
This disables various destructive functions and prevents the generated code
|
||
|
from interfering with the test (e.g. fork bomb, killing other processes,
|
||
|
removing filesystem files, etc.)
|
||
|
|
||
|
WARNING
|
||
|
This function is NOT a security sandbox. Untrusted code, including, model-
|
||
|
generated code, should not be blindly executed outside of one. See the
|
||
|
Codex paper for more information about OpenAI's code sandbox, and proceed
|
||
|
with caution.
|
||
|
"""
|
||
|
|
||
|
if maximum_memory_bytes is not None:
|
||
|
import resource
|
||
|
|
||
|
resource.setrlimit(
|
||
|
resource.RLIMIT_AS, (maximum_memory_bytes, maximum_memory_bytes)
|
||
|
)
|
||
|
resource.setrlimit(
|
||
|
resource.RLIMIT_DATA, (maximum_memory_bytes, maximum_memory_bytes)
|
||
|
)
|
||
|
if not platform.uname().system == "Darwin":
|
||
|
resource.setrlimit(
|
||
|
resource.RLIMIT_STACK, (maximum_memory_bytes, maximum_memory_bytes)
|
||
|
)
|
||
|
|
||
|
faulthandler.disable()
|
||
|
|
||
|
import builtins
|
||
|
|
||
|
builtins.exit = None
|
||
|
builtins.quit = None
|
||
|
|
||
|
import os
|
||
|
|
||
|
os.environ["OMP_NUM_THREADS"] = "1"
|
||
|
|
||
|
os.kill = None
|
||
|
os.system = None
|
||
|
os.putenv = None
|
||
|
os.remove = None
|
||
|
os.removedirs = None
|
||
|
os.rmdir = None
|
||
|
os.fchdir = None
|
||
|
os.setuid = None
|
||
|
os.fork = None
|
||
|
os.forkpty = None
|
||
|
os.killpg = None
|
||
|
os.rename = None
|
||
|
os.renames = None
|
||
|
os.truncate = None
|
||
|
os.replace = None
|
||
|
os.unlink = None
|
||
|
os.fchmod = None
|
||
|
os.fchown = None
|
||
|
os.chmod = None
|
||
|
os.chown = None
|
||
|
os.chroot = None
|
||
|
os.fchdir = None
|
||
|
os.lchflags = None
|
||
|
os.lchmod = None
|
||
|
os.lchown = None
|
||
|
os.getcwd = None
|
||
|
os.chdir = None
|
||
|
builtins.open = None
|
||
|
|
||
|
import shutil
|
||
|
|
||
|
shutil.rmtree = None
|
||
|
shutil.move = None
|
||
|
shutil.chown = None
|
||
|
|
||
|
import subprocess
|
||
|
|
||
|
subprocess.Popen = None # type: ignore
|
||
|
|
||
|
__builtins__["help"] = None
|
||
|
|
||
|
import sys
|
||
|
|
||
|
sys.modules["ipdb"] = None
|
||
|
sys.modules["joblib"] = None
|
||
|
sys.modules["resource"] = None
|
||
|
sys.modules["psutil"] = None
|
||
|
sys.modules["tkinter"] = None
|