۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

مقدمه Nuitka: راهی بهتر برای کامپایل و توزیع پایتون

می‌توانید از Nuitka برای کامپایل برنامه‌های پایتون در فایل‌های اجرایی مستقل استفاده کنید، سپس آنها را بدون زمان اجرا پایتون توزیع کنید.

می‌توانید از Nuitka برای کامپایل برنامه‌های پایتون در فایل‌های اجرایی مستقل استفاده کنید، سپس آنها را بدون زمان اجرا پایتون توزیع کنید.

با افزایش محبوبیت پایتون، محدودیت‌های آن واضح‌تر می‌شود. برای یک چیز، نوشتن یک برنامه 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.

شکل ۱. کامپایل یک برنامه بزرگ و پیچیده با 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 ممکن است زمان شروع برنامه را به میزان قابل توجهی کاهش دهد.