Py2exe
از PyLearn.com
| نکته ها و ترفند ها • ماژول ها و ابزار وابسته • نمونه پروژه و برنامه • پرسش و پاسخ |
فهرست مندرجات |
چرا با py2exe احتياج داريم ؟
همانطور كه مي دانيد پايتون يك زبان تفسيري مي باشد . بنابراين براي اجراي كد نياز به يك برنامه مفسر مي باشد تا كد هاي برنامه را خوانده و همزمان اجرا كند . اين روش مزيت ها و معايبي را دارا مي باشد . شايد ازجمله مهمترين معايب اين روش نياز هميشگي به مفسر مي باشد . يعني برنامه نوشته شده با اين روش قادر به اجرا در سيستم هايي كه مفسر ندارند نيست .
اين مشكل در سيستم هاي مبتني بر لينوكس بسيار كمتر به چشم مي خورد . چون تقريبا همه توزيع هاي لينوكس يك نسخه از مفسر پايتون را بصورت پيشفرض دارند . ولي در سيستم عامل هايي چون ويندوز كه بسيار پر كاربرد هستند فعلا بصورت پيشفرض مفسر اين زبان گنجانده نشده است . پس برنامه نويسان و توسعه دهنگان زبان پايتون بران شدند تا روشهايي براي اجراي مستقل فايل در سيستم عامل ويندوزو متعاقبا ساير سيستم عامل ها ايجاد كنند . با استفاده از اين روش ها فايل سورس نوشته شده به يك فايل مستقل اجرايي تبديل مي شود كه براي اجرا به مفسر نيازي ندارد !
py2exe چيست ؟
py2exe نام يك ابزار بسته بندي كننده براي زبان تفسيري پايتون مي باشد كه وظيفه اصلي آن بسته بندي ماژول هاي و فايل هاي مورد نياز برنامه نوشته شده و ايجاد فايلي مستقل مي باشد . بطور خلاصه py2exe را مي توان بصورت زير معرفي كرد :
- ابزار بسته بندي كننده براي بسته بندي فايل ها و ماژول هاي مورد نياز برنامه و خود مفسر .
- برنامه ايجاد شده توانايي اجراي مستقل بدون نياز به مفسر را دارا مي باشد .
- اين ابزار كامپايلر يا پيوند دهنده (Linker) نمي باشد . ! پايتون زباني تفسيري است و امكان كامپايل ندارد .
- فايل هاي ايجاد شده بر خلاف سورس پورتابل و قابل حمل(portable) نيستند . يعني فقط بر روي ويندوز و خانواده آن قابل اجرا مي باشد .
- اين ابزار يك ابزار ايجاد كننده نصاب نيست ! براي اضافه كردن نصاب به برنامه خود مي توانيد از خروجي هاي اين ابزار استفاده كنيد . ابزارهايي نيز براي اين كار وجود دارند كه مهمترين آنها عبارتند از : nsis و Inno
py2exe چگونه كار مي كند ؟
طريقه كار اين ابزار بر خلاف ظاهر كار آسان است . ايتدا فايل اصلي برنامه را كه بايد براي اجراي برنامه با جرا در آيد معرفي مي كنيد . py2exe شروع به خواندن فايل اصلي پروژه مي كند . سپس توسط ابزاري بنام modulefinder تمام ماژول ها و فايل هاي dll مورد نياز برنامه را كه براي اجراي آن ضروري مي باشد شناسايي مي كند . سپس فايل ها و ماژول هاي شناسايي شده را در داخل يك يا چند فايل بسته بندي مي كند . سپس به فايل هاي بسته بندي شده يك فايل اجرايي اصلي با فرمت exe اضافه مي كند . تنظيمات نهايي را براي امكان اجرا فراهم مي نمايد و نتيجه كار در داخل پوشه اي بنام dist قرار مي گيرد . در داخل اين پوشه يك فايل اجرايي با همان نام پروژه قرار دارد كه بدون نياز به هيچ برنامه ، فايل كتابخانه اي و نصب شدن قابل اجرا مي باشد .
| نام فايل | توضيح |
|---|---|
| app.exe | فايل اصلي برنامه كه مي توان آيكني دلخواه براي آن انتخاب كرد . براي اينكار به بخش آيكن فايل اجرايي مراجعه كنيد . |
| python??.dll | اين فايل در حقيقت مفسر پايتون و هسته مركزي و اصلي برنامه شماست . |
| library.zip | اين فايل يك فايل فشرده معمولي مي باشد كه همه فايل هاي سورس و مورد نياز بصورت فشرده شده داخل آن قرار دارند . |
| pyd.* | فايل هايي با پسوند pyd در حقيقت همان فايل هاي dll هستند و كاري دقيقا يكسان انجام مي دهند . اين فايل هاي توابع و ابزار مورد نياز براي اجراي برنامه و دستورات را در خود دارند . همچين از طريق اين فايل ها امكان اجراي محلي و بومي دستورات در سيستم عامل فراهم مي گردد . |
| dll.* | برخي از فايل هاي pyd به اين فايل ها نياز دارند . |
| w9xpopen.exe | اين فايل امكان اجراي برنامه در سيستم عامل Win9x از خانواده ويندوز را فراهم مي كند . |
شروع کار و فراهم آوردن مقدمات
برای این که از py2exe استفاده کنید ابتدا باید آن را روی سیستم نصب کنید یا به اصطلاح patch کنید برای این کار فایل زیر را دانلود و اجرا کنید دانلود py2exe از لینک غیر مستقیم
استفاده ساده از py2exe
ايجاد و تست برنامه
در اولين گام يك برنامه را با زبان پايتون بنويسيد . براي مثال كد زير :
def Main():
s = raw_input('What is your name? ')
print 'Hi %s,'%s
print 'I Love Python !'
Main()
سپس فايل را با نام test.py ذخيره كنيد .
ايجاد فايل نصاب
كار اصلي بسته بندي و كنترل روند آن بر عهده يك اسكريپت به زبان پايتون مي باشد . اين اسكريپت معمولا تحت نام setup.py ذخيره مي گردد و حاوي اطلاعاتي در مورد چگونگي عمل بسته بندي مي باشد . در اين بخش يك مثال ساده از اين نوع فايل را بيان مي كنيم .
from distutils.core import setup
import py2exe
setup(console = [{"script": 'test.py'}])
اكنون از طريق برنامه كنسول (داس - cmd.exe) به مسير برنامه ذخيره شده رفته و دستور زير را اجرا كنيد .
اگر در اجراي فايل مشكلي پيش آمد احتمالا آدرس مفسر پايتون در متغيير محيطي path قرار ندارد . براي اطلاعات بيشتر به مقاله اولین برنامه مراجعه كنيد . که اگر برنامه بالا را نصب کرده باشید این مشکل بوجود نمی آید
صفحه متن با نوشته ايي پر خواهد شد . در صورتي كه روند تبديل و بسته بندي بدرستي انجام گيرد در همان مسير جاري دو پوشه با نام هاي build و dist ايجاد شده است . فايل هاي مربوط به فايل اجرايي مستقل درون شاخه dist قرار دارد . اكنون مي توانيد هم از طريق همان محيط متني و هم از پنجره گرافيكي به مسير برنامه رفته و آنرا اجرا كنيد .
تنظيمات
در جدول زير ليستي از پارامتر ها و متغيير هاي پركاربرد فايل نصاب را مشاهده مي نماييد :
| نام دستور يا پارامتر | توضيح |
|---|---|
| console | ابزار py2exe فايل هاي موجود در اين متغيير را به فايل اجرايي تحت كنسول تبديل مي كند . |
| windows | فايل هاي موجود در اين متغيير به فايل اجرايي گرافيكي (GUI) تبديل مي شود . |
| service | متغييري حاوي ليستي از ماژول هايي كه حاوي كلاس هاي سرويس هاي ويندوز 32 بيتي هستند . |
| com_server | اين متغيير حاوي ليستي از ماژول هايي هسك كه شامل كلاس هاي سرور com مي باشند . |
| zipfile | نام فايل فشرده اي است كه بايد ايجاد گردد . مي توانيد در اسم گذاري از زير دايركتوري هم استفاده كنيد . مقدار اين متغيير بصورت پيش فرض 'library.zip' است . |
| optimize | مقداري رشته اي يا عدد صحيح كه فقط مي تواند يكي از سه مقدار 0 ، 1 يا 2 باشد . |
| includes | حاوي ليستي از اسامي ماژول ها كه به همراه برنامه بسته بندي مي گردند . |
| packages | ليستي از بسته ها كه به همراه زير بسته ها در بسته بندي توسط ابزار py2exe به فايل هاي نهايي اضافه مي گردد . |
| ignores | شامل اسامي ماژول هايي هست كه در صورت پيدا نشدن ناديده گرفته مي شوند . |
| excludes | شامل ليستي از ماژول ها مي باشد كه در روند بسته بندي كنار گذاشته مي شوند و از آنها استفاده نمي شود . |
| dll_excludes | ليست فايل هاي dllاي كه ناديده گرفته مي شوند . |
| dist_dir | نام پوشه اي كه فايل هاي نهايي در داخل آن ايجاد مي گردد . بطور پيشفرض مقدار اين متغيير برابر با dist مي باشد . |
| bitmap_resources | ليستي از فايل هاي تصوير مورد استفاده در برنامه كه يك تاپل دوتايي بصورت (id, path) مي باشند . |
| icon_resources | ليستي از فايل هاي آيكن مورد استفاده در برنامه كه يك تاپل دوتايي بصورت (id, path) مي باشند . |
| other_resources | ليستي از ساير فايل هاي مورد استفاده در برنامه كه يك تاپل دوتايي بصورت (resource_type, id, datastring) مي باشند . |
نكات و رفع اشكال
هر برنامه نويس بايستي براي داشتن بهترين فايل خروجي و مورد نظر خود تنشيماتي را در فايل نصاب اعمال كنيد . در اين بخش به بررسي ترفند هايي خاص و نيز مشكلات معمول ابزار py2exe خواهيم پرداخت .
مشكل فايل اجرايي با encodings
در برخي از برنامه هاي متني و اكثر برنامه هايي با رابط گرافيكي و بخصوص برنامه هايي كه از ساير زبانها چون فارسي استفاده مي كنند پس از ايجاد و اجراي فايل اجرايي پيغام خطايي مبني بر ناتواني از پيدا كردن ماژول encodings نمايش داده مي شود و برنامه اجرا نمي گردد . معمولا متن خطا شبيه به حالت زير مي باشد :
براي رفع اين مشكل كافي هست ماژول encodings رو به متغيير packages اضافه كنيم . نمونه اي از استفاده از اين كد را در بخش استفاده حرف اي همين فصل مي توانيد ببينيد . كد نوشته شده بدين صورت خواهد بود :
آيكن فايل اجرايي
براي اينكار همانطور كه قبلا هم اشاره شد كافي هست متغيير icon_resources مقدار دهي گردد . كد نصاب توليد شده شبيه به حالت زير خواهد بود :
setup(
windows = [
{
"script": "with_gui.py",
"icon_resources": [(1, "myicon.ico")]
}
],
)
حذف dll هاي ناخواسته از فايل هاي بسته بندي شده
در برخي از موارد خاص و زماني كه شما از تكنولوژي ها و ماژول هاي خاصي استفاده مي كنيد كه وابستگي هايي به فايل هاي dll دارند هنگام بسته بندي معمولا اين فايل هاي dll به فايل هاي نهايي اضافه مي گردد . اين فايل ها باعث افزايش حجم برنامه مي گردند . اگر فايل dllاي هست ه مي توانيد از وجود آن در سيستم كاربر مطمئن شويد مي توايند ان را از ليست بسته بندي حذف كنيد . روش اينكار بسيار راحت مي باشد . فرض كنيد مي خواهيد فايل oci.dll را از فايل هاي نهايي بسته بندي شده حذف كنيد . كد نصاب شبيه به حالت زير خواهد بود .
بهينه سازي فايل خروجي
با استفاده از متغيير optimize در تنظميات فايل نصاب و مقدار دهي آن با بيشتري مقدار ممكنه يعني عدد 2 همه مازول هاي مورد استفاده با بايت كد تبديل شده و بهينه مي شوند . براي اعمال اين گزينه نيز از كدي شبيه زير استفاده كنيد :
در اين حالت كليه ماژول ها بجز خود فايل پروژه بهينه شده و بسته بندي مي شود . براي بهينه سازي خود فايل پروژه بايد هنگام اجراي دستور بسته بندي پارامتر OO- را به مفسر پايتون ارسال كنيد . يعني عمل بسته بندي بصورت زير خواهد بود :
حذف فايل library.zip و دروني سازي آن در فايل اجرايي
همانطور كه قبلا اشاره شد همه ماژول ها و فايل هاي مورد نياز بصورت فشرده شده در داخل يك فايل بنام library.zip قرار مي گيرند كه مي توانيد نام آنرا بوسيله مقداردهي متغيير zipfile و ازسال آن به تابع setup تغيير دهيد . در صورتي كه كه مقدار اين متغيير برابر None باشد فايلي با نام library.zip ايجاد نخواهد شد و اين فايل درون فايل اجرايي قرار خواهد گرغت . با اين كار تعداد فايل هاي ايجاد شده كاهش مي يابد .
اضافه كردن اطلاعات دلخواه به فايل اجرايي
برخي مواقع امكان اضافه كردن اطلاعاتي باينري به فايل اجرايي ايجاد شده بسيار مفيد و كاربردي مي باشد . يكي از اين موارد امكان اضافه كردن توضيحات مربوط به نسخه نرم افزار بدون تغيير كد ان مي باشد . اضافه كردن اطلاعاتي باينري به فايل اجرايي ايجاد شده توسط py2exe بسيار آسان مي باشد . به مثال زير توجه كنيد :
myrevisionstring="prog internal rev 1.0"
setup(windows=[{'script': "prog.py",
'other_resources': [(u"VERSIONTAG",1,myrevisionstring)],
'icon_resources': [(1,'prog.ico')]
}],
zipfile = r"subdir\modules.dat",
name="My Program",
version="1.0",
)
در ايم مثال متني را با نام VERSIONTAG در فايل اجرايي خود قرار داده ايم . اين برنامه داراي يك آيكن مي باشد و فايل فشرده حاوي ماژولها در آدرس subdir\modules.dat قرار دارد .
استفاده حرفه اي و يك مثال
اكثر برنامه هاي نوشته شده نيازمند اعمال پارامتر ها و تغييراتي در فايل نصاب (setup.py) هستند تا بهترين خروجي ممكن حاصل شود . در بخش بعد با روش هاي مختلف ايجاد فايل اجرايي مستقل و ترفند هاي گوناگون آشنا خواهيم شد . توسط اين روش ها امكان ايجاد فايل هايي كم حجم ، سريع و عاري از مشكل فراهم خواهد شد .
توجه كنيد كه برخي از تكنولوژي ها و ماژول ها نيازمند پارامتر ها و ترفند هايي خاص هستند تا به فايل اجرايي مستقل تبديل شوند و در صورت عدم اعمال آنها ممكن است در مراحل مختلفي به مشكل بر بخوريد . در ادامه درس يك اسكريپت حرفه اي تر و در عمل بهينه تر و آسان تر نصاب را مشاهده مي كنيد . اين فايل نصاب فقط سه فايل خروجي توليد مي كند و هنگام ايجاد فايل هاي خروجي نيز آنها را بصورت بينه فشرده كرده و در يك فايل قرار مي دهد .
#!/usr/bin/env python
from distutils.core import setup
import py2exe
import sys
sys.argv.append("py2exe")
sys.argv.append("--bundle")
sys.argv.append("1")
opt = {"py2exe": {"compressed": 1,
"optimize": 2,
"ascii": 1,
"bundle_files": 1,
"packages": ["encodings"]}}
setup(options = opt, zipfile=None, console = [{"script": 'test.py'}])
راه حل دیگری هم برای تبدیل اسکریپت های پایتون به فایل اجرایی وجود دارد وآن هم نرم افزاری است به نام Fishbone .
این برنامه قادر است کدهای پایتون شما را به فایل اجرایی stand alone تبدیل نماید . فایل های اجرایی تولید شده توسط این برنامه بر خلاف فایلهای اجرایی برنامه py2exe که حجم زیادی دارند ، از حجم بسیار کمی برخوردارند . این برنامه در دو نسخه مجانی و تجاری موجود می باشد در نسخه مجانی امکان اضافه کردن ماژول به کد نمی باشد ولی در نسخه تجاری هر ماژولی را می توان به کد برنامه اضافه نمود . برای دانلود این نرم افزار اینجا را ببینید

