File size: 3,808 Bytes
2afa69c 857bbdd 2afa69c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
import numpy as np
import math
from .grid import WorldGrid
from .fluids import HydroKernel
from .erosion_process import ErosionProcess
class ScriptExecutor:
"""
์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ ์คํ ์์ง
๋ณด์์ ์ํด ์ ํ๋ ํ๊ฒฝ์์ Python ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
"""
def __init__(self, grid: WorldGrid):
self.grid = grid
self.hydro = HydroKernel(grid)
self.erosion = ErosionProcess(grid)
def execute(self, script: str, dt: float = 1.0, allowed_modules: list = ['numpy', 'math']):
"""
์คํฌ๋ฆฝํธ ์คํ
Args:
script: ์คํํ Python ์ฝ๋ ๋ฌธ์์ด
dt: ์๊ฐ ๊ฐ๊ฒฉ (Time Step)
allowed_modules: ํ์ฉํ ๋ชจ๋ ๋ฆฌ์คํธ (๊ธฐ๋ณธ: numpy, math)
Available Variables in Context:
- grid: WorldGrid ๊ฐ์ฒด
- elevation: grid.elevation (Numpy Array)
- bedrock: grid.bedrock
- sediment: grid.sediment
- water_depth: grid.water_depth
- dt: Delta Time
- np: numpy module
- math: math module
- hydro: HydroKernel ๊ฐ์ฒด
- erosion: ErosionProcess ๊ฐ์ฒด
"""
# 1. ์คํ ์ปจํ
์คํธ(Namespace) ์ค๋น
context = {
'grid': self.grid,
'elevation': self.grid.elevation,
'bedrock': self.grid.bedrock,
'sediment': self.grid.sediment,
'water_depth': self.grid.water_depth,
'dt': dt,
'np': np,
'math': math,
'hydro': self.hydro,
'erosion': self.erosion,
# Helper functions
'max': max,
'min': min,
'abs': abs,
'pow': pow,
'print': print, # ๋๋ฒ๊น
์ฉ
'range': range,
'len': len,
'int': int,
'float': float,
'round': round,
'sum': sum,
'enumerate': enumerate,
'zip': zip,
'list': list,
'tuple': tuple,
'dict': dict,
'set': set,
'str': str,
'bool': bool,
'True': True,
'False': False,
'None': None,
}
# 2. ๊ธ์ง๋ ํค์๋ ์ฒดํฌ (๊ธฐ๋ณธ์ ์ธ ๋ณด์)
# ์๋ฒฝํ ์๋๋ฐ์ค๋ ์๋์ง๋ง, ์ค์ ๋ฐฉ์ง์ฉ
forbidden = ['import os', 'import sys', 'open(', 'exec(', 'eval(', '__import__']
for bad in forbidden:
if bad in script:
raise ValueError(f"๋ณด์ ๊ฒฝ๊ณ : ํ์ฉ๋์ง ์๋ ํค์๋ '{bad}'๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.")
# 3. ์ฝ๋ ์คํ
try:
exec(script, {"__builtins__": {}}, context)
# 4. ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์ (Elevation์ derived property์ง๋ง, ์ง์ ์์ ํ์ ์ ์์ผ๋ฏ๋ก)
# ์ฌ์ฉ์๊ฐ elevation์ ์์ ํ๋ค๋ฉด bedrock/sediment ์
๋ฐ์ดํธ๊ฐ ๋ชจํธํด์ง.
# Grid ํด๋์ค์ update_elevation()์ bedrock+sediment -> elevation์ด๋ฏ๋ก,
# ์ฌ์ฉ์๊ฐ elevation์ ์์ ํ๋ฉด ๋ฌด์๋ ์ ์์.
# ๊ฐ์ด๋: "bedrock"์ด๋ "sediment"๋ฅผ ์์ ํ์ธ์.
# ํ์ง๋ง ํธ์๋ฅผ ์ํด elevation์ด ๋ฐ๋์์ผ๋ฉด bedrock์ ๋ฐ์ํ๋ ๋ก์ง ์ถ๊ฐ
# ๋ณ๊ฒฝ ์ elevation๊ณผ ๋น๊ตํด์ผ ํ๋?
# ์ผ๋จ grid.update_elevation()์ ํธ์ถํ์ฌ ๋๊ธฐํ
# (๋ง์ฝ ์ฌ์ฉ์๊ฐ bedrock์ ๋ฐ๊ฟจ๋ค๋ฉด ๋ฐ์๋จ)
self.grid.update_elevation()
return True, "์คํ ์ฑ๊ณต"
except Exception as e:
return False, f"์คํ ์ค๋ฅ: {str(e)}"
|