LLMใฎPythonในใฏใชใใๅบๅใๆฏ่ผ็ๅฎๅ จใซๅฎ่กใใใใใใใใๆใฃใฆๅฒใจใใใพใใใญใไฝฟใใฎใฏ่ชๅใ ใใชใฎใงๆใใฎใฏๅถ็ถๅฑ้บใชใณใผใใๅบใฆใใๆใ ใใใฟใใใชใฑใผในใงใใ
ใงใไธ้ใซๅบๅใฃใฆใๆ ๅ ฑใฏDockerใไฝฟใฃใใใฎ (llm-sandbox) ใจใใWebAssemblyใไฝฟใฃใใใฎ (Pyodide) ใจใใCPythonไปฅๅคใฎๅฎ่ฃ ใไฝฟใฃใใใฎ (PyPyใฎใตใณใใใใฏในๆฉ่ฝ) ใจใใWebใตใผใในๅใใฎ้้็ดใฎใใฎใฐใใใ่ปฝใใฃใใงใใใ pysandbox ใฏใใถใคใณใซๆฌ ้ฅใใใใๅถ้ใๅคใ้็บไธญๆญขใจใชใฃใฆใใพใใใ
ใใใชไธญใงใใฆใฉใใใใใใตใณใใใใฏในใฎPython็ฐๅขใงใใในใใฎPython็ฐๅขใจๅใใใฎใไฝฟใใใฐ็ฎก็ใๆฅฝใชใฎใซใใจๆใใชใใ่ชฟในใฆใใพใใใ
ใใฎ็ตๆใPythonใฉใคใใฉใชใฎไธญใงใฏๆฑบๅฎๆใ่ฆใคใใใชใใฃใใใฎใฎใLinux็ฐๅขใฎไธญใงใฏ systemd-nspawn ใ่ชญใฟ่พผใฟๅฐ็จใใฆใณใใงไฝฟใๆนๆณใๆใใคใ๏ผไฝใใซใผใๆจฉ้ใๅฟ ่ฆ๏ผใใใฎ systemd-nspawn ใซไผผใชใใใใซใผใๆจฉ้ใไธ่ฆใชbubblewrap (bwrap) ใ่ฆใคใใใใฎ bwrap ใไฝฟใฃใฆใตใณใใใใฏในใง Python ในใฏใชใใใๅฎ่กใใใณใผใใๆธใใฆใฟใพใใใ
# License: Public Domain
import os
import subprocess
home_dir = os.path.expanduser("~")
try:
os.makedirs("/tmp/mysandbox_root")
except FileExistsError:
pass
def sandbox_pyexec(code):
proc = subprocess.Popen(
["bwrap", "--bind", "/tmp/mysandbox_root", "/", "--ro-bind", "/bin", "/bin", # ใทในใใ ใใกใคใซใRead-Onlyใงๅ
ฑๆใใ
"--ro-bind", "/lib", "/lib", "--ro-bind", "/lib64", "/lib64",
"--ro-bind", "/usr", "/usr", "--ro-bind", "/etc", "/etc", # ใใใพใ่ฏใใชใ
"--ro-bind", home_dir + "/.local/lib", home_dir + "/.local/lib", # pip ใฉใคใใฉใชใRead-Onlyใงๅ
ฑๆใใ
"--ro-bind", home_dir + "/.local/bin", home_dir + "/.local/bin",
"--ro-bind", home_dir + "/.local/share", home_dir + "/.local/share",
"--bind", "/proc", "/proc", "--unshare-all", "--", # ใชใในใใในใใจ้ๅ
ฑๆ๏ผsystemd-nspawnใจ้ใฃใฆใใญใปในใชในใใฏๅ
ฑๆใใฆใใใฉ๏ผ
"bash", "-c", "python -"], # Pythonใงๆจๆบๅ
ฅๅใฎใณใผใใๅฎ่ก
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True # stdin / stdout ใๆๅญๅใจใใฆๆฑใ
)
result, err = proc.communicate(code)
return (result.strip(), err.strip())
r, err = sandbox_pyexec( """print("ใใใฏใในใใงใ")""")
print("stdout:", r)
print("stderr:", err)
# stdout: ใใใฏใในใใงใ
# stderr:
r, err = sandbox_pyexec( """import os
os.system("ls /")""")
print("stdout:", r)
print("stderr:", err)
# stdout: bin
# etc
# home
# lib
# lib64
# proc
# usr
# stderr:
r, err = sandbox_pyexec( """wrong python syntax here""")
print("stdout:", r)
print("stderr:", err)
# stdout:
# stderr: File "<stdin>", line 1
# wrong python syntax here
# ^^^^^^
# SyntaxError: invalid syntax
ใคใณใฉใฟใฏใใฃใใทใงใซ็
ใคใณใฟใฉใฏใใฃใใทใงใซใง็ฐๅขใไฟๅญใใ็ใไฝใใพใใ๏ผ2026ๅนด1ๆ11ๆฅ่ฟฝ่จ๏ผใ
# License: Public Domain
import os
import pty
import termios
import select
import sys
home_dir = os.path.expanduser("~")
try:
os.makedirs("/tmp/mysandbox_root")
except FileExistsError:
pass
def disable_echo(fd):
attrs = termios.tcgetattr(fd)
attrs[3] = attrs[3] & ~termios.ECHO # lflags ใใ ECHO ใ่ฝใจใ
termios.tcsetattr(fd, termios.TCSANOW, attrs)
def sandbox_pyenv():
pid, fd = pty.fork()
if pid == 0: # child
# sys.stdout.flush()][
disable_echo(0)
os.execvp("bwrap",
["bwrap", "--bind", "/tmp/mysandbox_root", "/", "--ro-bind", "/bin", "/bin", # ใทในใใ ใใกใคใซใRead-Onlyใงๅ
ฑๆใใ
"--ro-bind", "/lib", "/lib", "--ro-bind", "/lib64", "/lib64",
"--ro-bind", "/usr", "/usr", "--ro-bind", "/etc", "/etc", # ใใใพใ่ฏใใชใ
"--ro-bind", home_dir + "/.local/lib", home_dir + "/.local/lib", # pip ใฉใคใใฉใชใRead-Onlyใงๅ
ฑๆใใ
"--ro-bind", home_dir + "/.local/bin", home_dir + "/.local/bin",
"--ro-bind", home_dir + "/.local/share", home_dir + "/.local/share",
"--bind", "/proc", "/proc", "--unshare-all", "--", # ใชใในใใในใใจ้ๅ
ฑๆ๏ผsystemd-nspawnใจ้ใฃใฆใใญใปในใชในใใฏๅ
ฑๆใใฆใใใฉ๏ผ
"python", "-i"], # Pythonใฎใคใณใฟใฉใฏใใฃใใขใผใใงๆจๆบๅ
ฅๅใฎใณใผใใๅฎ่ก
)
exit()
else:
output = b""
while True:
r, _, _ = select.select([fd], [], [])
chunk = os.read(fd, 1024)
output += chunk
if output.endswith(b">>> "):
#print("debug: bunner: %s"%output)
break
return fd
def sandbox_pyexec(fd, code):
output = b""
for line in code.split("\n"):
os.write(fd, line.encode("utf-8") + b"\n")
while True:
r, _, _ = select.select([fd], [], [])
chunk = os.read(fd, 1024)
output += chunk
if output.endswith(b">>> ") or output.endswith(b"... "):
output = output[:-4] # ใใญใณใใใ้คๅป
break
text = output.decode(errors="ignore")
return text
def sandbox_reset(fd):
sandbox_pyexec(fd, """globals().clear()
import gc
gc.collect()
globals().clear()
""")
fd = sandbox_pyenv()
print("[exec]%s[/exec]"%sandbox_pyexec(fd, "a = 100")) # [exec][/exec]
print("[exec]%s[/exec]"%sandbox_pyexec(fd, "print(a)")) # [exec]100\n[/exec]
print("[exec]%s[/exec]"%sandbox_pyexec(fd, "a")) # [exec]100\n[/exec]
print("[exec]%s[/exec]"%sandbox_pyexec(fd, "b")) # [exec]Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\nNameError: name 'b' is not defined\n[/exec]
print("[exec]%s[/exec]"%sandbox_pyexec(fd, """print("aaa")\nprint("bbb")""")) # [exec]aaa\nbbb\n[/exec]
print("[exec]%s[/exec]"%sandbox_pyexec(fd, """print("aaa" + \\\n "bbb")""")) # [exec]aaabbb\n[/exec]
sandbox_reset(fd)
print("[exec]%s[/exec]"%sandbox_pyexec(fd, "a")) # [exec]Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\nNameError: name 'a' is not defined\n[/exec]
Comments
Let's comment your feelings that are more than good