استفاده از electron بعنوان رابط کاربری برای پایتون

electron image
همه حداقل یک بار اسم electron به گوششون خورده. ایده این که «همه چیز یک وبسایت است» خیلی جذاب به نظر میاد. اما جاوا اسکریپت فعلی نمی‌تونه فراتر از یک حدی رشد کنه چیزایی مثل Heavy sandboxing، ارتباط با قطعات سخت افزاری و حتی توی بحث سوکت، IMAP و SMTP هم محدودیت‌های خودش رو داره.

اما پایتون از این طرف یک زبان برنامه نویسی با پتانسیل بالاست که در مقایسه با API های nodeJS می‌شه گفت پایتون بدون محدودیته ولی وقتی که بحث سر GUI باشه اشک توسعه دهنده رو در میاره. برای همین داشتم به این فکر می‌کردم که چطور از الکترون به عنوان رابط کاربری استفاده کنم درحالی که هسته اصلی برنامه با پایتون باشه ؟

روش پیاده سازی

خوشبختانه ایده من چیز عجیبی نبود و قبلا هم درموردش بحث شده که نهایتا به دو روش زیر می‌رسیم:

روش اول

الکترون به عنوان سکوی اجرای نرم افزار یک سری صفحه وب که به صورت داینامیک با پایتون نوشته شدن رو لود می‌کنه. که از اون طریق تمام کار های پیچیده سرو سامان داده می‌شن.

روش دوم

بازهم از الکترون به عنوان سکوی اجرای نرم افزار استفاده می‌کنیم اما با این تفاوت که الکترون یک سری صفحه html رو که شامل رابط کاربری هستن به صورت استاتیک لود می‌کنه و برای ارتباط با پایتون و پیاده کردن هسته نرم افزار می‌شه یک RESTful API نوشت یا از ابزاری مثل zeromq استفاده کرد.

درواقع روش دوم معقول تره اما برای پیاده سازی یک مثال MVCE مناسب نیست پس من اینجا از روش اول توی مثال استفاده می‌کنم. و توضیحات لازم رو برای روش دوم میدم که خیلی هم متفاوت نیست.

یک مثال کامل

این مثال رو بر اساس مثال hello world که توی مستندات الکترون نوشته شده بود پیاده کردم. خیلی سخت نیست. چیزی که مهمه ایجاد یک child process هست که اسکریپت پایتون رو صدا بزنه.

اول پیش نیاز های پایتون و الکترون:

حالا یک مثال ساده با Flask:

خب بریم سراغ الکترون:

حالا توی main.js یک child process ایجاد می‌کنیم که فایل application.py رو صدا بزنه بعد بررسی می‌کنیم که سرور توی اون آدرس بالا اومده یا نه و بعد از بالا اومدن سرور، پنجره اصلی الکترون رو می‌سازیم و به صفحه لوکال هاست اشاره می‌کنیم.

حالا کافیه پروژه رو اجرا کنید !

توزیع و بسته بندی

شاید هنوز براتون سوال باشه که خب فرضا با پایتون برنامه رو ساختیم و توی الکترون صداش زدیم حالا چطوری پروژه رو بسته بندی کنیم؟

این کار خیلی سادست با ابزاری مثل Anaconda یا PyInstaller پروژه ای که با پایتون نوشته شده رو به یک برنامه مستقل تبدیل کنید (البته برای ویندوز؛ توی لینوکس و مک که پایتون پیشفرض نصبه) خط ۱۶ و ۱۷ رو نگاه کنید؛ من اوبونتو استفاده می کنم ولی خط ۱۷ نشون دادم که باید سورس پایتون رو کامپایل کنید. (البته در جریان توسعه نیاز نیست می‌تونید به همون فایل پایتون اشاره کنید).

بعد از اینکه فایل کامپایل شد اون رو به پوشه dist اضافه کنید اینطوری وقتی که با الکترون پروژه اصلی رو بسته بندی کنید اون فایل کامپایل شده هم به عنوان جزئی از پروژه بسته بندی می‌شه.

روش دوم چطوره؟

مثلا ساختار یک میل کلاینت رو در نظر بگیرید. همونطور که اشاره کردم کار کردن با SMTP و IMAP توی nodeJS سخته. حتی N1 هم هسته اصلیش رو با پایتون نوشته شده که به صورت یک سرویس ابری خدماتش رو ارائه میده.

برای یک همچین چیزی میشه یک RESTful API نوشت که کار خواندن و ارسال ایمیل رو انجام بده. مثلا:

اینطوری صفحات استاتیک توی الکترون نقش رابط کاربری رو ایفا می‌کنن و تمام کارای مهم با پایتون انجام میشه بدون اینکه یک ذره درگیر محدودیت های nodeJS بشیم. تازه اگر مقصد فقط ویندوز باشه می‌شه با c++ یا c# یک برنامه console application نوشت.

Author’s gravatar

مرسی مطلب خوبی بود.
فقط اینکه چون بحث GUI هست بهتره از عکس هم استفاده می‌کردی 🙂

نظری در این مورد دارید؟ خوشحال می‌شم اون رو برام ارسال کنید