Py2exe

از PyLearn.com

پرش به: ناوبری, جستجو
این نوشته (Py2exe) بخشی از کتاب پایتون می باشد .
نکته ها و ترفند ها ماژول ها و ابزار وابسته نمونه پروژه و برنامه پرسش و پاسخ


فهرست مندرجات

چرا با py2exe احتياج داريم ؟

همانطور كه مي دانيد پايتون يك زبان تفسيري مي باشد . بنابراين براي اجراي كد نياز به يك برنامه مفسر مي باشد تا كد هاي برنامه را خوانده و همزمان اجرا كند . اين روش مزيت ها و معايبي را دارا مي باشد . شايد ازجمله مهمترين معايب اين روش نياز هميشگي به مفسر مي باشد . يعني برنامه نوشته شده با اين روش قادر به اجرا در سيستم هايي كه مفسر ندارند نيست .

اين مشكل در سيستم هاي مبتني بر لينوكس بسيار كمتر به چشم مي خورد . چون تقريبا همه توزيع هاي لينوكس يك نسخه از مفسر پايتون را بصورت پيشفرض دارند . ولي در سيستم عامل هايي چون ويندوز كه بسيار پر كاربرد هستند فعلا بصورت پيشفرض مفسر اين زبان گنجانده نشده است . پس برنامه نويسان و توسعه دهنگان زبان پايتون بران شدند تا روشهايي براي اجراي مستقل فايل در سيستم عامل ويندوزو متعاقبا ساير سيستم عامل ها ايجاد كنند . با استفاده از اين روش ها فايل سورس نوشته شده به يك فايل مستقل اجرايي تبديل مي شود كه براي اجرا به مفسر نيازي ندارد !

py2exe چيست ؟

py2exe نام يك ابزار بسته بندي كننده براي زبان تفسيري پايتون مي باشد كه وظيفه اصلي آن بسته بندي ماژول هاي و فايل هاي مورد نياز برنامه نوشته شده و ايجاد فايلي مستقل مي باشد . بطور خلاصه py2exe را مي توان بصورت زير معرفي كرد :

  • ابزار بسته بندي كننده براي بسته بندي فايل ها و ماژول هاي مورد نياز برنامه و خود مفسر .
  • برنامه ايجاد شده توانايي اجراي مستقل بدون نياز به مفسر را دارا مي باشد .
  • اين ابزار كامپايلر يا پيوند دهنده (Linker) نمي باشد . ! پايتون زباني تفسيري است و امكان كامپايل ندارد .
  • فايل هاي ايجاد شده بر خلاف سورس پورتابل و قابل حمل(portable) نيستند . يعني فقط بر روي ويندوز و خانواده آن قابل اجرا مي باشد .
  • اين ابزار يك ابزار ايجاد كننده نصاب نيست ! براي اضافه كردن نصاب به برنامه خود مي توانيد از خروجي هاي اين ابزار استفاده كنيد . ابزارهايي نيز براي اين كار وجود دارند كه مهمترين آنها عبارتند از : nsis و Inno

py2exe چگونه كار مي كند ؟

طريقه كار اين ابزار بر خلاف ظاهر كار آسان است . ايتدا فايل اصلي برنامه را كه بايد براي اجراي برنامه با جرا در آيد معرفي مي كنيد . py2exe شروع به خواندن فايل اصلي پروژه مي كند . سپس توسط ابزاري بنام modulefinder تمام ماژول ها و فايل هاي dll مورد نياز برنامه را كه براي اجراي آن ضروري مي باشد شناسايي مي كند . سپس فايل ها و ماژول هاي شناسايي شده را در داخل يك يا چند فايل بسته بندي مي كند . سپس به فايل هاي بسته بندي شده يك فايل اجرايي اصلي با فرمت exe اضافه مي كند . تنظيمات نهايي را براي امكان اجرا فراهم مي نمايد و نتيجه كار در داخل پوشه اي بنام dist قرار مي گيرد . در داخل اين پوشه يك فايل اجرايي با همان نام پروژه قرار دارد كه بدون نياز به هيچ برنامه ، فايل كتابخانه اي و نصب شدن قابل اجرا مي باشد .


فايل هاي ايجاد شده توسط py2exe
نام فايل توضيح
app.exe فايل اصلي برنامه كه مي توان آيكني دلخواه براي آن انتخاب كرد . براي اينكار به بخش آيكن فايل اجرايي مراجعه كنيد .
python??.dll اين فايل در حقيقت مفسر پايتون و هسته مركزي و اصلي برنامه شماست .
library.zip اين فايل يك فايل فشرده معمولي مي باشد كه همه فايل هاي سورس و مورد نياز بصورت فشرده شده داخل آن قرار دارند .
pyd.* فايل هايي با پسوند pyd در حقيقت همان فايل هاي dll هستند و كاري دقيقا يكسان انجام مي دهند . اين فايل هاي توابع و ابزار مورد نياز براي اجراي برنامه و دستورات را در خود دارند . همچين از طريق اين فايل ها امكان اجراي محلي و بومي دستورات در سيستم عامل فراهم مي گردد .
dll.* برخي از فايل هاي pyd به اين فايل ها نياز دارند .
w9xpopen.exe اين فايل امكان اجراي برنامه در سيستم عامل Win9x از خانواده ويندوز را فراهم مي كند .

شروع کار و فراهم آوردن مقدمات

برای این که از py2exe استفاده کنید ابتدا باید آن را روی سیستم نصب کنید یا به اصطلاح patch کنید برای این کار فایل زیر را دانلود و اجرا کنید دانلود py2exe از لینک غیر مستقیم

استفاده ساده از py2exe

ايجاد و تست برنامه

در اولين گام يك برنامه را با زبان پايتون بنويسيد . براي مثال كد زير :


فايل test.py تصویر:code.png
def Main():
    s = raw_input('What is your name? ')
    print 'Hi %s,'%s
    print 'I Love Python !'
    
Main()   


سپس فايل را با نام test.py ذخيره كنيد .

ايجاد فايل نصاب

كار اصلي بسته بندي و كنترل روند آن بر عهده يك اسكريپت به زبان پايتون مي باشد . اين اسكريپت معمولا تحت نام setup.py ذخيره مي گردد و حاوي اطلاعاتي در مورد چگونگي عمل بسته بندي مي باشد . در اين بخش يك مثال ساده از اين نوع فايل را بيان مي كنيم .


setup.py فايل تصویر:code.png
from distutils.core import setup
import py2exe

setup(console = [{"script": 'test.py'}])


اكنون از طريق برنامه كنسول (داس - cmd.exe) به مسير برنامه ذخيره شده رفته و دستور زير را اجرا كنيد .


تصویر:terminal.png
E:\py>setup.py py2exe


اگر در اجراي فايل مشكلي پيش آمد احتمالا آدرس مفسر پايتون در متغيير محيطي path قرار ندارد . براي اطلاعات بيشتر به مقاله اولین برنامه مراجعه كنيد . که اگر برنامه بالا را نصب کرده باشید این مشکل بوجود نمی آید

صفحه متن با نوشته ايي پر خواهد شد . در صورتي كه روند تبديل و بسته بندي بدرستي انجام گيرد در همان مسير جاري دو پوشه با نام هاي build و dist ايجاد شده است . فايل هاي مربوط به فايل اجرايي مستقل درون شاخه dist قرار دارد . اكنون مي توانيد هم از طريق همان محيط متني و هم از پنجره گرافيكي به مسير برنامه رفته و آنرا اجرا كنيد .


تصویر:terminal.png
E:\py>cd dist

E:\py\dist>test.exe
What is your name? mehdi
Hi mehdi,
I Love Python !



تنظيمات

در جدول زير ليستي از پارامتر ها و متغيير هاي پركاربرد فايل نصاب را مشاهده مي نماييد :


پارامتر ها و دستورات مورد استفاده در نصاب py2exe
نام دستور يا پارامتر توضيح
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 نمايش داده مي شود و برنامه اجرا نمي گردد . معمولا متن خطا شبيه به حالت زير مي باشد :


خطاي هنگام ايجاد فايل اجرايي تصویر:code.png
LookupError: no codec search functions registered: can't find encoding


براي رفع اين مشكل كافي هست ماژول encodings رو به متغيير packages اضافه كنيم . نمونه اي از استفاده از اين كد را در بخش استفاده حرف اي همين فصل مي توانيد ببينيد . كد نوشته شده بدين صورت خواهد بود :


خطاي هنگام ايجاد فايل اجرايي تصویر:code.png
opt = {"py2exe": {"packages": ["encodings"]}}


آيكن فايل اجرايي

براي اينكار همانطور كه قبلا هم اشاره شد كافي هست متغيير icon_resources مقدار دهي گردد . كد نصاب توليد شده شبيه به حالت زير خواهد بود :


اضافه كردن آيكن به فايل اجرايي تصویر:code.png
setup(
    windows = [
        {
            "script": "with_gui.py",
            "icon_resources": [(1, "myicon.ico")]
        }
    ],
)


حذف dll هاي ناخواسته از فايل هاي بسته بندي شده

در برخي از موارد خاص و زماني كه شما از تكنولوژي ها و ماژول هاي خاصي استفاده مي كنيد كه وابستگي هايي به فايل هاي dll دارند هنگام بسته بندي معمولا اين فايل هاي dll به فايل هاي نهايي اضافه مي گردد . اين فايل ها باعث افزايش حجم برنامه مي گردند . اگر فايل dllاي هست ه مي توانيد از وجود آن در سيستم كاربر مطمئن شويد مي توايند ان را از ليست بسته بندي حذف كنيد . روش اينكار بسيار راحت مي باشد . فرض كنيد مي خواهيد فايل oci.dll را از فايل هاي نهايي بسته بندي شده حذف كنيد . كد نصاب شبيه به حالت زير خواهد بود .


اضافه كردن آيكن به فايل اجرايي تصویر:code.png
    setup(
        options = {"py2exe": { "dll_excludes": ["oci.dll"]}},
        ...
    )


بهينه سازي فايل خروجي

با استفاده از متغيير optimize در تنظميات فايل نصاب و مقدار دهي آن با بيشتري مقدار ممكنه يعني عدد 2 همه مازول هاي مورد استفاده با بايت كد تبديل شده و بهينه مي شوند . براي اعمال اين گزينه نيز از كدي شبيه زير استفاده كنيد :


اضافه كردن آيكن به فايل اجرايي تصویر:code.png
    setup(
            options={"py2exe":{"optimize":2}},
            console=["beep.py"]
    )


در اين حالت كليه ماژول ها بجز خود فايل پروژه بهينه شده و بسته بندي مي شود . براي بهينه سازي خود فايل پروژه بايد هنگام اجراي دستور بسته بندي پارامتر OO- را به مفسر پايتون ارسال كنيد . يعني عمل بسته بندي بصورت زير خواهد بود :


تصویر:terminal.png
python -OO setup.py py2exe


حذف فايل library.zip و دروني سازي آن در فايل اجرايي

همانطور كه قبلا اشاره شد همه ماژول ها و فايل هاي مورد نياز بصورت فشرده شده در داخل يك فايل بنام library.zip قرار مي گيرند كه مي توانيد نام آنرا بوسيله مقداردهي متغيير zipfile و ازسال آن به تابع setup تغيير دهيد . در صورتي كه كه مقدار اين متغيير برابر None باشد فايلي با نام library.zip ايجاد نخواهد شد و اين فايل درون فايل اجرايي قرار خواهد گرغت . با اين كار تعداد فايل هاي ايجاد شده كاهش مي يابد .

اضافه كردن اطلاعات دلخواه به فايل اجرايي

برخي مواقع امكان اضافه كردن اطلاعاتي باينري به فايل اجرايي ايجاد شده بسيار مفيد و كاربردي مي باشد . يكي از اين موارد امكان اضافه كردن توضيحات مربوط به نسخه نرم افزار بدون تغيير كد ان مي باشد . اضافه كردن اطلاعاتي باينري به فايل اجرايي ايجاد شده توسط py2exe بسيار آسان مي باشد . به مثال زير توجه كنيد :


اضفه كردن اطلاعات باينري به فايل اجرايي تصویر:code.png
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) هستند تا بهترين خروجي ممكن حاصل شود . در بخش بعد با روش هاي مختلف ايجاد فايل اجرايي مستقل و ترفند هاي گوناگون آشنا خواهيم شد . توسط اين روش ها امكان ايجاد فايل هايي كم حجم ، سريع و عاري از مشكل فراهم خواهد شد .

توجه كنيد كه برخي از تكنولوژي ها و ماژول ها نيازمند پارامتر ها و ترفند هايي خاص هستند تا به فايل اجرايي مستقل تبديل شوند و در صورت عدم اعمال آنها ممكن است در مراحل مختلفي به مشكل بر بخوريد . در ادامه درس يك اسكريپت حرفه اي تر و در عمل بهينه تر و آسان تر نصاب را مشاهده مي كنيد . اين فايل نصاب فقط سه فايل خروجي توليد مي كند و هنگام ايجاد فايل هاي خروجي نيز آنها را بصورت بينه فشرده كرده و در يك فايل قرار مي دهد .


py2exe اسكريپت پيشرفته تر تصویر:code.png
#!/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 که حجم زیادی دارند ، از حجم بسیار کمی برخوردارند . این برنامه در دو نسخه مجانی و تجاری موجود می باشد در نسخه مجانی امکان اضافه کردن ماژول به کد نمی باشد ولی در نسخه تجاری هر ماژولی را می توان به کد برنامه اضافه نمود . برای دانلود این نرم افزار اینجا را ببینید