۱۴۰۲ آبان ۱۴, یکشنبه

ساخت فایل اجرایی از فایل منبع پایتونی

 

 

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

آموزشهای زیادی از پکیج pyinstaller و همتای گرافیکی اون auto-py-to-exe در سطح اینترنت وجود داره که اغلب سرراست و ساده هستند . من قصد تکراراون آموزشها رو نداشتم و میخواستم ۲ تا مشکلی که در این راه بهشون برخورد کردم رو توضیح بدم و در نهایت راه حلی که پیدا کردم رو هم ارائه بدم . ولی برای ناقص نبودن آموزش کمی درباره ویژوال اینورایرونمنت پایتون و پکیج ها و pyinstaller و روش کار باهاش مینویسم .

نکته اول اینکه سعی کنید در یک Virtual Environment  پکیج های خودتون رو نصب کنید . بصورت همزمان میتونید چند پروزه رو داسته باشید با ورژن های مختلفی از پیکج های پایتون .

برای نصب پکیج به سادگی بعد از نصب پایتون میتونید در CMD ویندوز یا تریمنال لینوکس با استفاده از دستور pip پکیج Virtualenv رو نصب کنید :

pip install virtualenv

در مرحله بعد مسیری برای پروژه خودتون درنظر بگیرید که من با آدرس /path/to/project/ نمایش میدمش . با استفاده از دستور زیر یک نسخه ایزوله شده از پایتون در این مسیر نصب میکنیم و در آینده تمام پکیج های مورد نیاز برنامه مون رو در این مسیر بصورت ایزوله نصب میکنیم تا درصورت تغییرات پکیج ها برنامه های دیگه ما دچار مشکل نشوند . در ادامه در این مورد بیشتر توضیح میدم تا موضوع روشن بشه:

$ virtualenv /path/to/project/my_project_name

دستور بالا در مسیری که مشخص کردیم یک محیط مجازی میسازه . درصورتیکه نسخه خاصی از پایتون برای برنامه خودتون در نظر داشته باشید میتونید با سوئیچ p- اون رو مشخص کنید و همون نسخه خاص از پایتون براتون نصب میشه . در غیر اینصورت آخرین ورژن پایتون براتون نصب میشه:

virtualenv -p /usr/bin/python2.7 virtualenv_name

کد بالا پایتون 2.7 رو در محیط مجازی شما فعال میکنه . ( کد در ترمینال لینوکس کار میکنه برای ویندوز از این کد نمیشه استفاده کرد) .

بعد از ساخت محیط مجازی باید برای استفاده از اون ، فعالش کنیم . برای این کار با دستور زیر در ویندوز این کار رو انجام میدیم :

cd <path/to/project/my_project_name>

Scripts\activate

در لینوکس از دستور زیر برای فعال سازی استفاده میکنیم :

$ source /path/to/project/my_project_name/bin/activate

در مرحله بعد یک اعلان که اسم پروژه شماست قبل از مسیر جاری در ترمینال یا CMD نمایش داده میشه :


در انتها برای غیر فعال کردن محیط مجازی از دستور deactivate در ترمینال استفاده میکنیم.

برای نصب پکیج های مورد نیاز برنامه خودتون از دستور pip میتونید استفاده کنید . درصورتیکه ورژن خاصی مدنظرتون هست بصورت زیر به pip اعلام کنید . در غیر اینصورت pip آخرین ورژن برنامه رو از مخزن میگیره و نصب میکنه.

(virtualenv_name)$pip install opencv_python==4.0.1

این دستور ورژن 4.0.1 از پکیج Opencv رو در محیط شما نصب میکنه . البته اگر یک پکیج پیش نیازهایی داشته باشه اونها هم نصب میشوند . مثلا با نصب پکیج pytorch تعداد بسیار زیادی پکیج دیگه هم به همراهش نصب میشوند .

بعد از نوشتن برنامه و نصب پکیج های لازم باید پکیج pyinstaller را با استفاده از دستور pip نصب کنیم . بعد از اتمام فرآیند توسعه برنامه باید برنامه را در فرمت فایل اجرایی آماده کنیم . با استفاده از pyinstaller بصورت زیر میتوانیم فایل اجرایی بسازیم:

pyinstaller --onefile main.py -w

دستور بالا از فایل main.py یک فایل اجرایی میسازد . سوئیچ w- باعث سرکوب ترمینال میشود . در حین اجرای برنامه کنسول یا ترمینال باز نخواهد شد و برنامه فقط در مد گرافیکی کار خواهد کرد . 

سوئیچ onefile-- باعث میشود که فقط یک فایل اجرایی داشته باشیم . تمام برنامه به همراه پکیج ها و تمام موارد مورد نیاز در یک فایل exe مجتمع خواهد شد . در صورتیکه از این سوئیچ استفاده نشود یک فایل اجرایی کوچک به همراه یک فولدر حاوی کتابخانه ها و فایل های لازم برای اجرا برنامه خواهیم داشت . 

آیکون برنامه را با استفاده از سوئیچ icon--  و معرفی یک فایل ico. میتوان تغییر داد.

باقی سوئیچ ها را در صفحه توضیحات پکیج pyinstaller میتوانید ببنید.

بعد از اجرای برنامه pyinstaller یک فایل با پسوند spec. و همنام با فایل اصلی برنامه خواهیم داشت . یک فولدر با نام build و یک فولدر dist  تشکیل میشود که فایل های اجرایی در آن قرار خواهند داشت.

یک مشکل در فایل های پایتون بزرگ با کتابخانه های زیاد رسیدن به محدودیت ۵۰۰۰ فایل میباشد 

در تصویر فوق مشخص است که هنگام اتصال بسته torch به محدودیت ۵۰۰۰ فایل رسیده ایم . برای رفع این مشکل بعد از اتمام کار و تشکیل فولدرهای dist  و build فایل spec. را بصورت زیر تغییر میدهیم .

من در برنامه خودم از YOLOv8 استفاده کرده ام . که بعد از ساخت فایل exe به برنامه اضافه میکنیم . در غیر اینصورت هنگام اجرای فایل exe با خطا مواجه شده و برنامه اجرا نخواهد شد:

ابتدا فایل spec. را باز میکنیم و بصورت زیر آن را تغییر میدهیم، فایل ابتدایی بصورت زیر است که باید قسمت فوقانی تغییر یابد:

بصورت زیر تغییر میدهیم :


 کد زیر را جایگزین قسمت فوقانی میکنیم تا هم محدودیت تعداد فایل را بیشتر کنیم و هم کتابخانه Ultralitics را برای اجرای برنامه به آن اضافه کنیم :

# -*- mode: python ; coding: utf-8 -*-
import sys
from PyInstaller.utils.hooks import collect_data_files
from ultralytics import YOLO
ultra_files = collect_data_files('ultralytics')
sys.setrecursionlimit(500000)

a = Analysis(
['Rnet.py'],
pathex=[],
binaries=[],
datas=ultra_files, # <- This is for enabling the referencing of all data files in the Ultralytics library.
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
noarchive=False,
)

نام برنامه خود را به جای Rnet.py در فایل spec. قرار دهید .

بعد از اصلاح فایل SPEC. کد زیر را اجرا کنید تا کامپایل برنامه شما کامل شود :

python Rnet.spec

که بجای Rnet اسم برنامه خودتون رو بنویسید.

همچنین یک فایل data.yaml حاوی نام کلاسهای مورد استفاده در YOLO را باید در کنار فایل اجرایی قرار دهیم .

هیچ نظری موجود نیست:

ارسال یک نظر