Python_engine / app.py
Gttfhuss's picture
Update app.py
ef9f743 verified
Raw
History Blame Contribute Delete
8.93 kB
import io
import sys
import os
import subprocess
import traceback
import time
import base64
import re
import gradio as gr
# دالة ذكية مستوحاة من Pydroid 3 لفحص الكود وتثبيت المكتبات المستدعاة تلقائياً
def auto_install_imports(code):
# البحث عن كل العبارات الفنية مثل import X أو from X import Y
imports = re.findall(r'^\s*(?:import|from)\s+([a-zA-Z0-9_]+)', code, re.MULTILINE)
# استبعاد المكتبات القياسية المضمنة في بايثون لتسريع التشغيل
standard_libs = [
"sys", "os", "io", "time", "re", "math", "random", "json", "datetime",
"hashlib", "urllib", "subprocess", "threading", "traceback", "builtins"
]
installed_now = []
for lib in set(imports):
if lib not in standard_libs:
try:
__import__(lib)
except ImportError:
# إذا كانت المكتبة غير موجودة، يتم تثبيتها فوراً عبر pip
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", lib])
installed_now.append(lib)
except Exception:
pass
return installed_now
def pydroid_core_engine(code, terminal_inputs):
if not code or not code.strip():
return "⚠️ [Pydroid Core]: لا يوجد كود برمي داخل المحرر لتشغيله.", "الرجاء كتابة كود بايثون...", None, None
# 1. تشغيل ميزة التثبيت التلقائي للمكتبات قبل التنفيذ
installed_libs = auto_install_imports(code)
install_status = f"📦 تم فحص السكربت وتثبيت المكتبات تلقائياً: {installed_libs}\n" if installed_libs else ""
# 2. تنظيف مخلفات الرسوميات والمحاكاة السابقة
for f in ["live_frame.png", "live_simulation.html"]:
if os.path.exists(f):
try: os.remove(f)
except: pass
# 3. محاكاة آلية قراءة الطرفية (Terminal Inputs) الحر تماماً
user_lines = terminal_inputs.splitlines() if terminal_inputs else []
modified_code = f"""
import builtins
_terminal_data = {repr(user_lines)}
_data_ptr = 0
def _pydroid_input(prompt=""):
global _data_ptr
if prompt: print(prompt, end="")
if _data_ptr < len(_terminal_data):
val = _terminal_data[_data_ptr]
print(val) # طباعة المدخل في الكونسول لمحاكاة الشاشة السوداء
_data_ptr += 1
return val
return "" # نص فارغ لمنع توقف السيرفر المفاجئ عند انتهاء الأسطر
builtins.input = _pydroid_input
""" + code
# 4. توجيه قنوات المخرجات والتحكم الرسومي بأمان مفرط
old_stdout, old_stderr = sys.stdout, sys.stderr
redirected_output = sys.stdout = io.StringIO()
redirected_error = sys.stderr = io.StringIO()
exec_env = {}
error_occurred = False
start_time = time.time()
try:
# تنفيذ السكربت البرمجي مباشرة
exec(modified_code, exec_env)
except Exception:
error_occurred = True
print(traceback.format_exc(), file=redirected_error)
runtime_duration = round(time.time() - start_time, 2)
stdout_text = redirected_output.getvalue()
stderr_text = redirected_error.getvalue()
# إعادة قنوات النظام الأصلية فوراً لحماية البيئة الحاضنة
sys.stdout, sys.stderr = old_stdout, old_stderr
# 5. معالجة وتوليد واجهات العرض ثلاثية الأبعاد والأشكال الثابتة
interactive_visual_html = None
if os.path.exists("live_simulation.html"):
try:
with open("live_simulation.html", "r", encoding="utf-8") as f:
html_content = f.read()
b64_encoded = base64.b64encode(html_content.encode('utf-8')).decode('utf-8')
interactive_visual_html = f'<iframe src="data:text/html;base64,{b64_encoded}" style="width:100%; height:520px; border:none; border-radius:10px; background:#050507;"></iframe>'
except Exception as e:
stderr_text += f"\n[Error 3D Render]: {e}"
static_frame_img = "live_frame.png" if os.path.exists("live_frame.png") else None
# صياغة حالة التقرير النهائي للوحة التحكم
if error_occurred or stderr_text:
status_msg = f"❌ انتهى التشغيل بوجود خطأ | المستغرق: {runtime_duration} ثانية"
console_final = f"{install_status}{stdout_text}\n⚠️ --- تفاصيل خطأ السكربت ---\n{stderr_text}"
return status_msg, console_final, static_frame_img, interactive_visual_html
else:
status_msg = f"✅ اكتمل التنفيذ بنجاح كلي | المستغرق: {runtime_duration} ثانية"
console_final = f"{install_status}{stdout_text}" if (stdout_text or install_status) else "ℹ️ تم تنفيذ السكربت بنجاح (لا توجد مخرجات نصية لعرضها)."
return status_msg, console_final, static_frame_img, interactive_visual_html
# 🎨 هندسة الواجهة الرسومية الاحترافية المظلمة المطابقة لـ Pydroid 3
ui_theme_css = """
body, .gradio-container { background-color: #12141c !important; font-family: 'Consolas', 'Segoe UI', monospace; }
.pydroid-header { background: linear-gradient(135deg, #1e293b, #0f172a); border: 1px solid #334155; border-radius: 12px; padding: 18px; text-align: center; margin-bottom: 15px; }
.pydroid-header h1 { color: #ffe600; margin: 0; font-size: 26px; font-weight: bold; text-shadow: 0 0 12px rgba(255, 230, 0, 0.2); }
.pydroid-header p { color: #94a3b8; font-size: 13px; margin-top: 5px; }
.section-lbl { color: #38bdf8; font-weight: bold; font-size: 14px; margin-bottom: 6px; }
"""
with gr.Blocks() as demo:
gr.HTML("<div class='pydroid-header'><h1>🖥️ PYDROID 3 ADVANCED CORE ENGINE</h1><p>بيئة تطوير متكاملة على المتصفح مع تثبيت تلقائي للمكتبات وحقن طرفي حر للمدخلات</p></div>")
with gr.Row():
system_status = gr.Textbox(label="حالة معالج السيرفر الحالي", value="🟢 مستقر تماماً ومستعد للتشغيل الحُر...", interactive=False)
with gr.Row():
with gr.Column(scale=3):
gr.HTML("<div class='section-lbl'>📝 محرر أكواد بايثون (Python Code Editor)</div>")
code_editor = gr.Code(
language="python",
lines=15,
label=None,
value="# اكتب أو الصق سكربت الأداة هنا\nprint('مرحباً بك في نظام Pydroid 3 المطور!')\nname = input('أدخل اسمك هنا: ')\nprint('أهلاً وسهلاً بك يا', name)"
)
with gr.Column(scale=2):
gr.HTML("<div class='section-lbl'>📥 شاشة مدخلات الطرفية الحرة (Terminal Inputs)</div>")
terminal_box = gr.Textbox(
lines=5,
label=None,
placeholder="اكتب هنا كافة المدخلات أو الخيارات التي سيطلبها منك السكربت.\nضع كل إدخال في سطر منفصل بحرية تامة..."
)
execute_btn = gr.Button("⚡ تشغيل السكربت (Run Code)", variant="primary", size="lg")
with gr.Row():
with gr.Column():
gr.HTML("<div class='section-lbl' style='margin-top:15px;'>📺 شاشات عرض النتائج وبث المحاكاة والتفاعل</div>")
with gr.Tabs():
with gr.Tab("📋 مخرجات الطرفية النصية (Console Out)"):
console_view = gr.Textbox(lines=11, label=None, interactive=False)
with gr.Tab("🌐 لوحة التحكم التفاعلية 3D"):
visual_3d_html = gr.HTML()
with gr.Tab("🖼️ شاشة البث الصوري الثابت"):
visual_static_img = gr.Image(label=None, interactive=False)
# ربط كبسة التشغيل الفوري بالمعالج المستقر الجديد
execute_btn.click(
fn=pydroid_core_engine,
inputs=[code_editor, terminal_box],
outputs=[system_status, console_view, visual_static_img, visual_3d_html]
)
# تشغيل وإطلاق السيرفر مع تمرير التنسيق الخارجي داخل دالة launch حصرياً
if __name__ == "__main__":
demo.launch(css=ui_theme_css, theme=gr.themes.Default())