میتوانید از Nuitka برای کامپایل برنامههای پایتون در فایلهای اجرایی مستقل استفاده کنید، سپس آنها را بدون زمان اجرا پایتون توزیع کنید.
- نصب Nuitka
- استفاده از Nuitka برای اولین بار
- کامپایل یک برنامه پایتون با Nuitka
- شامل واردات پویا
- شامل فایلها و فهرستهای داده
- شامل بستهها و ماژولهای Python
- کامپایل یک برنامه پایتون برای توزیع مجدد
با افزایش محبوبیت پایتون، محدودیتهای آن واضحتر میشود. برای یک چیز، نوشتن یک برنامه Python و توزیع آن بین افرادی که پایتون را نصب نکرده اند، می تواند بسیار سخت باشد.
متداول ترین راه برای حل این مشکل، بسته بندی برنامه به همراه تمام کتابخانه ها و فایل های پشتیبانی کننده آن و زمان اجرا پایتون است. ابزارهایی برای انجام این کار وجود دارد، مانند PyInstaller، اما برای درست کار کردن به مقدار زیادی بسته بندی نیاز دارند. علاوه بر این، اغلب امکان استخراج کد منبع برنامه پایتون از بسته به دست آمده وجود دارد. برای برخی از سناریوها، این یک معامله شکسته است.
Nuitka، یک پروژه شخص ثالث، یک راه حل اساسی ارائه می دهد. این برنامه یک برنامه پایتون را در یک باینری C کامپایل میکند – نه با بستهبندی زمان اجرا CPython با بایت کد برنامه، بلکه با ترجمه دستورالعملهای Python به C. نتایج را میتوان در یک بسته فشرده توزیع کرد یا در یک نصب کننده با محصول شخص ثالث دیگری بستهبندی کرد.
Nuitka همچنین تلاش میکند تا حداکثر سازگاری را با اکوسیستم پایتون حفظ کند، بنابراین کتابخانههای شخص ثالث مانند NumPy بهطور قابل اعتماد کار میکنند. Nuitka همچنین سعی میکند تا حد امکان عملکرد برنامههای پایتون کامپایلشده را بهبود بخشد، اما دوباره بدون از بین بردن سازگاری کلی. افزایش سرعت نیز تضمین نشده است – آنها بین بارهای کاری بسیار متفاوت هستند و برخی از برنامه ها ممکن است بهبود عملکرد قابل توجهی را تجربه نکنند. به عنوان یک قاعده کلی، بهتر است برای بهبود عملکرد به Nuitka تکیه نکنید، بلکه به عنوان یک راه حل بسته بندی.
نصب Nuitka
Nuitka با پایتون ۲.۶ تا ۲.۷ و پایتون ۳.۳ تا ۳.۱۰ کار می کند. می تواند باینری ها را برای Microsoft Windows، macOS، Linux و FreeBSD/NetBSD کامپایل کند. توجه داشته باشید که باید باینری ها را روی پلتفرم هدف بسازید. شما نمی توانید متقابل کامپایل کنید.
برای هر پلتفرمی، به غیر از نیاز به زمان اجرا پایتون، به یک کامپایلر C نیز نیاز دارید. در مایکروسافت ویندوز، Visual Studio 2022 یا بالاتر توصیه می شود، اما استفاده از MinGW-w64 C11 (gcc
۱۱.۲ یا بالاتر). برای پلتفرمهای دیگر، میتوانید از gcc
۵.۱ یا بالاتر، g++
۴.۴ یا بالاتر، clang
یا clang-cl
در ویندوز تحت ویژوال استودیو.
توجه داشته باشید که اگر از Python 3.3 یا Python 3.4 (که مدتها منسوخ شدهاند) استفاده میکنید، به دلیل وابستگی ابزار به Python 2.7 نیاز خواهید داشت. اگر می توانید همه اینها باید یک استدلال برای استفاده از جدیدترین نسخه پایتون باشد.
بهتر است Nuitka را در یک محیط مجازی همراه با پروژه خود به عنوان یک وابستگی توسعه به جای وابستگی توزیع نصب کنید. Nuitka خود با پروژه شما همراه نیست یا توسط پروژه شما استفاده نمی شود. این بسته بندی را انجام می دهد.
استفاده از Nuitka برای اولین بار
هنگامی که Nuitka را نصب کردید، از nuitka
یا python -m nuitka
برای فراخوانی آن استفاده کنید.
اولین کاری که میخواهید با Nuitka انجام دهید این است که کل زنجیره ابزار، از جمله کامپایلر C خود را تأیید کنید. برای آزمایش این، میتوانید یک برنامه ساده Python «Hello world» را کامپایل کنید – آن را main.py
:
بنامید
print ("Hello world")
وقتی یک برنامه پایتون را با Nuitka کامپایل میکنید، نام ماژول نقطه ورود را به عنوان پارامتر به Nuitka میدهید، برای مثال nuitka main.py
. وقتی Nuitka به این شکل فراخوانی میشود، main.py
را میگیرد و یک فایل اجرایی از آن میسازد.
توجه داشته باشید که چون ما فقط در حال آزمایش عملکرد Nuitka هستیم، فقط آن یک فایل پایتون را در یک فایل اجرایی کامپایل میکند. هیچ چیز دیگری را جمعآوری نمیکند و چیزی را برای توزیع مجدد جمع نمیکند. اما کامپایل کردن یک فایل برای تعیین اینکه آیا زنجیره ابزار Nuitka به درستی تنظیم شده است کافی است.
هنگامی که کامپایل به پایان رسید، باید یک فایل اجرایی باینری را مشاهده کنید که در همان دایرکتوری برنامه پایتون قرار گرفته است. فایل اجرایی را اجرا کنید تا مطمئن شوید کار می کند.
همچنین میتوانید بهطور خودکار برنامه کامپایلشده Nuitka خود را با ارسال --run
بهعنوان پرچم خط فرمان اجرا کنید.
اگر فایل اجرایی آزمایشی “Hello world” شما کار می کند، می توانید آن را به عنوان یک قابل توزیع مجدد بسته بندی کنید. به زودی این روند را توضیح خواهم داد.
توجه داشته باشید که وقتی اولین مجموعه آزمایشی خود را با Nuitka اجرا می کنید، احتمالاً در عرض چند ثانیه کامل می شود. گول این را نخورید! در حال حاضر، شما فقط یک ماژول واحد را کامپایل می کنید، نه کل برنامه خود را. کامپایل یک برنامه کامل با Nuitka ممکن است چند دقیقه یا بیشتر طول بکشد، بسته به اینکه برنامه از چند ماژول استفاده می کند.
کامپایل یک برنامه پایتون با Nuitka
بهطور پیشفرض، Nuitka فقط ماژولی را که شما مشخص کردهاید کامپایل میکند. اگر ماژول شما دارای واردات است – چه از جای دیگری در برنامه شما، از کتابخانه استاندارد یا از بسته های شخص ثالث – باید مشخص کنید که آنها نیز باید کامپایل شوند.
نسخه اصلاح شده برنامه “Hello world” را در نظر بگیرید، جایی که یک ماژول مجاور به نام greet.py
دارید:
def greet(name):
print ("Hello ", name)
و یک main.py
:
اصلاح شده
import greet
greet.greet("world")
برای کامپایل کردن هر دو ماژول، می توانید از سوئیچ --follow-imports
استفاده کنید:
nuitka --follow-imports main.py
سوئیچ تضمین میکند که تمام واردات مورد نیاز در سراسر برنامه از دستورات import
ردیابی شده و با هم کامپایل میشوند.
یک گزینه دیگر، --nofollow-import-to
، به شما امکان می دهد زیر شاخه های خاصی را از فرآیند واردات حذف کنید. این گزینه برای بررسی مجموعه های آزمایشی یا ماژول هایی که می دانید هرگز استفاده نمی شوند مفید است. همچنین به شما این امکان را می دهد که یک علامت عام به عنوان آرگومان ارائه دهید.
شکل ۱. کامپایل یک برنامه بزرگ و پیچیده با Nuitka. این مثال شامل کامپایل ماژول Pyglet به همراه بسیاری از ماژول ها در کتابخانه استاندارد است که چند دقیقه طول می کشد.
شامل واردات پویا
اکنون یکی از چروک هایی است که کاربران پایتون معمولاً هنگام تلاش برای بسته بندی برنامه پایتون برای توزیع با آن مواجه می شوند. گزینه --follow-imports
فقط از طریق عبارت import
واردهای صراحتاً اعلام شده در کد را دنبال می کند. وارد کردن پویا را انجام نمی دهد.
برای دور زدن این موضوع، میتوانید از سوئیچ --include-plugin-directory
برای ارائه یک یا چند مسیر به ماژولهایی که به صورت پویا وارد میشوند، استفاده کنید. به عنوان مثال، برای دایرکتوری به نام mods
که حاوی کدهای وارد شده به صورت پویا است، از:
استفاده کنید.
nuitka --follow-imports --include-plugin-directory=mods main.py
شامل فایل ها و فهرست های داده
اگر برنامه پایتون شما از فایل های داده بارگیری شده در زمان اجرا استفاده می کند، Nuitka نیز نمی تواند به طور خودکار آن ها را شناسایی کند. برای گنجاندن فایلها و فهرستهای منفرد با برنامههای بستهبندیشده Nuitka، از --include-data-files
و --include-data-dir
استفاده کنید.
--include-data-files
به شما امکان می دهد یک علامت عام برای فایل ها برای کپی کردن و جایی که می خواهید در آن کپی شوند مشخص کنید. به عنوان مثال، --include-data-files=/data/*=data/
همه فایل هایی را که با علامت data/*
مطابقت دارند را می گیرد و در کپی می کند. data/
در فهرست توزیع شما.
--include-data-dir
تقریباً به همین صورت کار می کند، با این تفاوت که از علامت عام استفاده نمی کند. فقط به شما امکان می دهد یک مسیر برای کپی و یک مقصد در پوشه توزیع برای کپی کردن آن عبور دهید. به عنوان مثال، --include-data-dir=/path/to/data=data
همه چیز را در /path/to/data
در فهرست منطبق data
در فهرست توزیع شما.
شامل بستهها و ماژولهای Python
یک راه دیگر برای تعیین واردات، استفاده از فضای نام بسته به سبک پایتون به جای مسیر فایل، با استفاده از گزینه --include-package
است. به عنوان مثال، دستور زیر شامل mypackage
، در هر کجا که روی دیسک باشد (با فرض اینکه پایتون بتواند آن را پیدا کند) و هر چیزی که در زیر آن قرار دارد، خواهد بود:
nuitka --include-package=mypackage main.py
اگر بستهها به فایلهای داده خود نیاز دارند، میتوانید آنهایی را با گزینه --include-package-data
وارد کنید:
nuitka --include-package=mypackage --include-package-data=mypackage main.py
این دستور به Nuitka میگوید که هر فایلی را در فهرست بسته که در واقع کد نیستند، انتخاب کند.
اگر میخواهید فقط یک ماژول را اضافه کنید، میتوانید از --include-module
استفاده کنید:
nuitka --include-module=mypackage.mymodule main.py
این دستور به Nuitka میگوید که فقط mypackage.mymodule
را شامل شود، اما هیچ چیز دیگری.
کامپایل یک برنامه پایتون برای توزیع مجدد
وقتی میخواهید یک برنامه پایتون را با Nuitka برای توزیع مجدد کامپایل کنید، میتوانید از یک سوئیچ خط فرمان، --مستقل
استفاده کنید که بیشتر کارها را انجام میدهد. این سوئیچ به طور خودکار همه واردات را دنبال می کند و یک پوشه dist
ایجاد می کند که شامل فایل اجرایی کامپایل شده و هر فایل پشتیبانی مورد نیاز است. برای توزیع مجدد برنامه، فقط باید این دایرکتوری را کپی کنید.
انتظار نداشته باشید که یک برنامه --مستقل
-کامپایل شده در اولین باری که آن را اجرا می کنید کار کند. پویایی کلی برنامه های پایتون تضمین می کند که برای اطمینان از اجرای صحیح برنامه کامپایل شده باید از برخی از گزینه های دیگر که در بالا توضیح داده شد استفاده کنید. به عنوان مثال، اگر یک برنامه رابط کاربری گرافیکی دارید که به فونت های خاصی نیاز دارد، ممکن است مجبور شوید آنها را با --include-data-files
یا --include-data-dir< در توزیع خود کپی کنید. /code>.
همچنین، همانطور که در بالا ذکر شد، زمان کامپایل برای یک برنامه --مستقل
ممکن است به طور قابل توجهی بیشتر از کامپایل آزمایشی باشد. در زمان ساخت مورد نیاز برای آزمایش یک برنامه کاربردی ساختهشده بهصورت مستقل، زمانی که تصوری از مدت زمان لازم داشتید، بودجه را بپردازید.
در نهایت، Nuitka گزینه ساخت دیگری را ارائه می دهد، --onefile
. برای کسانی که با PyInstaller آشنا هستند، --onefile
به همان روشی که در آن برنامه وجود دارد کار میکند: کل برنامه شما، از جمله همه فایلهای وابسته به آن را در یک فایل اجرایی فشرده میکند و هیچ فایل دیگری برای آن لازم نیست. توزیع مجدد با این حال، مهم است بدانید که --onefile
در لینوکس و مایکروسافت ویندوز بهطور متفاوتی کار میکند. در لینوکس، یک فایل سیستم مجازی را با محتویات بایگانی نصب می کند. در ویندوز، فایلها را در یک فهرست موقت باز میکند و از آنجا اجرا میکند — و باید این کار را برای هر بار اجرای برنامه انجام دهد. استفاده از --onefile
در Windows ممکن است زمان شروع برنامه را به میزان قابل توجهی کاهش دهد.
پست های مرتبط
مقدمه Nuitka: راهی بهتر برای کامپایل و توزیع پایتون
مقدمه Nuitka: راهی بهتر برای کامپایل و توزیع پایتون
مقدمه Nuitka: راهی بهتر برای کامپایل و توزیع پایتون