هذه الوثيقة هي الوثيقة الأولى الموصى بقراءتها عند بدء استخدام Nuitka . في هذه الصفحة، ستتعرف على المزيد حول أساسيات Nuitka ، مثل نوع الترخيص وحالات الاستخدام والمتطلبات والائتمانات.
جدول المحتويات
متطلبات
الاستخدام
إعداد البرنامج التعليمي والبناء على نظام التشغيل Windows
حالات الاستخدام
القرص
مشاكل نموذجية
نصائح
تقرير التجميع
أداء
وظيفة غير مدعومة
Nuitka هو مترجم بايثون. هو مكتوب في بايثون. إنه استبدال أو امتداد سلس لمترجم Python ويجمع كل بنية تمتلكها Python 2 (2.6، 2.7) وPython 3 (3.4 - 3.13)، عند تشغيلها مع إصدار Python هذا.
ثم يقوم بعد ذلك بتنفيذ التعليمات البرمجية غير المترجمة والتعليمات البرمجية المترجمة معًا بطريقة متوافقة للغاية.
يمكنك استخدام جميع وحدات مكتبة Python وجميع وحدات الامتداد بحرية.
يقوم Nuitka بترجمة وحدات Python إلى برنامج على المستوى C يستخدم بعد ذلك ملفات libpython
وملفات C الثابتة الخاصة به للتنفيذ بنفس الطريقة التي يستخدمها CPython.
تهدف جميع عمليات التحسين إلى تجنب النفقات العامة، عندما لا يكون ذلك ضروريًا. لا شيء يهدف إلى إزالة التوافق، على الرغم من أنه سيتم إجراء تحسينات طفيفة في بعض الأحيان، حيث لا تتم محاكاة كل خطأ في Python القياسي، على سبيل المثال يتم تقديم رسائل خطأ أكثر اكتمالا، ولكن هناك وضع توافق كامل لتعطيل ذلك.
لضمان التشغيل السلس لـ Nuitka ، تأكد من اتباع متطلبات النظام، والتي تشمل المكونات التالية:
C المترجم
بايثون
نظام التشغيل
بنيان
أنت بحاجة إلى مترجم C مع دعم C11 أو بدلاً من ذلك مترجم C++ لـ C++03 [1].
حاليًا، هذا يعني أنك بحاجة إلى استخدام أحد هذه المترجمات:
يجب أن يعتمد برنامج التحويل البرمجي MinGW64 C11، على نظام التشغيل Windows، على إصدار gcc 11.2 أو أعلى. سيتم تنزيله تلقائيًا في حالة عدم العثور على مترجم C قابل للاستخدام، وهي الطريقة الموصى بها لتثبيته، حيث ستقوم Nuitka أيضًا بترقيته لك.
Visual Studio 2022 أو أعلى على نظام التشغيل Windows [2]. حزمة اللغة الإنجليزية للحصول على أفضل النتائج (يقوم Nuitka بتصفية المخرجات غير المرغوب فيها، ولكن للغة الإنجليزية فقط). سيتم استخدامه بشكل افتراضي إذا تم تثبيته.
على جميع الأنظمة الأساسية الأخرى، مترجم gcc
للإصدار 5.1 على الأقل، وتحت ذلك مترجم g++
للإصدار 4.4 على الأقل كبديل.
مترجم clang
على نظام التشغيل macOS X ومعظم بنيات FreeBSD.
على نظام التشغيل Windows، يمكن استخدام برنامج التحويل البرمجي clang-cl
على نظام التشغيل Windows إذا تم توفيره بواسطة مثبت Visual Studio.
[1] | يتم تقديم الدعم لهذا C11 مع gcc 5.x أو أعلى أو أي إصدار clang. لم يقوم مترجمو MSVC الأقدم بذلك بعد. ولكن كحل بديل، مع Python 3.10 أو أقدم، يتداخل معيار اللغة C++03 بشكل كبير مع C11، ثم يتم استخدامه بدلاً من ذلك. |
[2] | قم بالتنزيل مجانًا من https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx (إصدارات المجتمع تعمل بشكل جيد). يوصى باستخدام أحدث إصدار، ولكنه غير مطلوب. من ناحية أخرى، ليست هناك حاجة إلى دعم الإصدارات السابقة لنظام التشغيل Windows 10، وقد تناسبك، ولكن دعم هذه التكوينات متاح فقط للمستخدمين التجاريين. |
يتم دعم Python 2 (2.6، 2.7) و Python 3 (3.4 - 3.13). إذا كان هناك في أي وقت إصدار ثابت لـ Python غير موجود في هذه القائمة، فكن مطمئنًا أنه قيد العمل عليه وستتم إضافته.
مهم
بالنسبة إلى Python 3.4 وهذا الإصدار فقط ، نحتاج إلى إصدار Python آخر باعتباره تبعية لوقت الترجمة .
Nuitka نفسه متوافق تمامًا مع جميع الإصدارات المدرجة، لكن Scons كأداة مستخدمة داخليًا ليست كذلك.
بالنسبة لهذه الإصدارات، تحتاج أيضًا إلى تثبيت Python2 أو Python 3.5 أو أعلى، ولكن فقط أثناء وقت الترجمة. هذا للاستخدام مع Scons (الذي ينسق تجميع C)، والذي لا يدعم نفس إصدارات Python مثل Nuitka.
بالإضافة إلى ذلك، على نظام التشغيل Windows، لا يمكن استخدام Python2 لأن clcache
لا يعمل معه، ويجب تثبيت Python 3.5 أو أعلى.
تعثر Nuitka على إصدارات Python المطلوبة (على سبيل المثال، على Windows عبر التسجيل) ويجب ألا تلاحظ ذلك طالما تم تثبيتها.
تتوفر وظائف أخرى بشكل متزايد عندما يكون لدى بايثون آخر حزمة معينة مثبتة. على سبيل المثال، سيعمل ضغط ملف واحد مع Python 2.x عند العثور على Python آخر مثبت عليه الحزمة zstandard
.
نقل الثنائيات إلى أجهزة أخرى
يمكن جعل الثنائيات التي تم إنشاؤها قابلة للتنفيذ بشكل مستقل عن تثبيت Python، باستخدام خيارات --standalone
و --onefile
.
لاحقة اسم الملف الثنائي
تحتوي الثنائيات التي تم إنشاؤها على لاحقة .exe
على نظام التشغيل Windows. أما على الأنظمة الأساسية الأخرى، فلا تحتوي على لاحقة للوضع المستقل، أو لاحقة .bin
، التي يمكنك إزالتها أو تغييرها، أو تحديدها باستخدام الخيار -o
.
تمت إضافة اللاحقة لوضع التسريع فقط للتأكد من عدم تعارض اسم البرنامج النصي الأصلي والاسم الثنائي على الإطلاق، حتى نتمكن من الكتابة فوق الثنائي بأمان دون إتلاف الملف المصدر الأصلي.
يجب أن يكون CPython أو Anaconda Python أو Homebrew
أنت بحاجة إلى تطبيق Python القياسي، المسمى "CPython"، لتنفيذ Nuitka لأنه يرتبط ارتباطًا وثيقًا بتفاصيل التنفيذ الخاصة به.
لا يمكن أن يكون من متجر تطبيقات Windows
من المعروف أن متجر تطبيقات Windows Python لا يعمل بالتأكيد، وقد تم فحصه.
لا يمكن أن يكون pyenv على نظام التشغيل macOS
ومن المعروف أن نظام التشغيل MacOS "pyenv" لا يعمل. استخدم Homebrew بدلاً من ذلك لعمليات تثبيت Python المجمعة ذاتيًا. لكن لاحظ أن الوضع المستقل سيكون أسوأ على هذه الأنظمة الأساسية ولن يكون متوافقًا مع إصدارات macOS الأقدم.
أنظمة التشغيل المدعومة: Linux، وFreeBSD، وNetBSD، وmacOS، وWindows (32 بت/64 بت/ARM).
والبعض الآخر سوف يعمل كذلك. من المتوقع أن تكون قابلية النقل جيدة بشكل عام، ولكن على سبيل المثال، قد يلزم تعديل استخدام Scons الداخلي لـ Nuitka أو قد يحتاج إلى تمرير الإشارات. تأكد من مطابقة بنية برنامج التحويل البرمجي Python وC، وإلا فستتلقى رسائل خطأ مشفرة.
البنى المدعومة هي x86 وx86_64 (amd64) والذراع، ومن المحتمل أن تكون أكثر من ذلك بكثير.
من المتوقع أن تعمل البنى الأخرى أيضًا، خارج الصندوق، حيث أن Nuitka لا تستخدم بشكل عام أي مواصفات خاصة بالأجهزة. هذه هي فقط تلك التي تم اختبارها والمعروفة بأنها جيدة. ردود الفعل هي موضع ترحيب. بشكل عام، يمكن اعتبار البنيات التي يدعمها دبيان جيدة واختبارها أيضًا.
الطريقة الموصى بها لتنفيذ Nuitka هي <the_right_python> -m nuitka
للتأكد تمامًا من مترجم Python الذي تستخدمه، لذلك من الأسهل المطابقة مع ما لدى Nuitka.
الطريقة التالية الأفضل لتنفيذ Nuitka هي من خلال الخروج من المصدر أو الأرشيف، مع عدم وجود تغييرات في متغيرات البيئة، والجدير بالذكر أنه ليس عليك العبث مع PYTHONPATH
على الإطلاق بالنسبة لـ Nuitka. كل ما عليك فعله هو تنفيذ البرامج النصية التي تديرها nuitka
و nuitka-run
مباشرة دون أي تغييرات في البيئة. قد ترغب في إضافة دليل bin
إلى PATH
الخاص بك لراحتك، ولكن هذه الخطوة اختيارية.
علاوة على ذلك، إذا كنت تريد التنفيذ باستخدام المترجم الصحيح، في هذه الحالة، تأكد من تنفيذ <the_right_python> bin/nuitka
وكن جيدًا.
اختر المترجم الصحيح
إذا واجهت SyntaxError
، فمن المؤكد أنك اخترت المترجم الخطأ للبرنامج الذي تقوم بتجميعه.
لدى Nuitka خيار --help
لإخراج ما يمكنه فعله:
nuitka --مساعدة
الأمر nuitka-run
هو نفس nuitka
، لكن مع إعداد افتراضي مختلف. يحاول تجميع برنامج Python النصي وتنفيذه مباشرة:
nuitka-run --help
هذا الخيار المختلف هو --run
، ويمرر الوسيطات بعد الخيار غير الأول إلى الثنائي الذي تم إنشاؤه، لذا فهو يشبه إلى حد ما ما ستفعله python
البسيطة.
بالنسبة لمعظم الأنظمة، ستكون هناك حزم على صفحة تنزيل Nuitka. ولكن يمكنك أيضًا تثبيته من الكود المصدري كما هو موضح أعلاه، ولكن أيضًا مثل أي برنامج Python آخر، يمكن تثبيته عبر روتين python setup.py install
العادي.
إشعار للتكامل مع سير عمل GitHub، هناك Nuitka-Action الذي يجب عليك استخدامه والذي يجعل التكامل سهلًا حقًا. يجب أن تبدأ بالتجميع المحلي، لكن هذا سيكون أسهل للتجميع عبر المنصات باستخدام Nuitka.
Nuitka مرخص بموجب ترخيص Apache، الإصدار 2.0؛ ولا يجوز لك استخدامه إلا وفقًا للترخيص.
يمكنك الحصول على نسخة من الترخيص على http://www.apache.org/licenses/LICENSE-2.0
ما لم يكن ذلك مطلوبًا بموجب القانون المعمول به أو تم الاتفاق عليه كتابيًا، يتم توزيع البرامج الموزعة بموجب الترخيص على أساس "كما هي"، دون ضمانات أو شروط من أي نوع، سواء كانت صريحة أو ضمنية. راجع الترخيص لمعرفة الأذونات والقيود التي تحكم اللغة المحددة بموجب الترخيص.
هذه خطوات أساسية إذا لم يكن لديك أي شيء مثبتًا، بالطبع إذا كان لديك أي جزء من الأجزاء، فما عليك سوى تخطيها.
قم بتنزيل وتثبيت Python من https://www.python.org/downloads/windows
حدد أحد Windows x86-64 web-based installer
(64 بت Python، مستحسن) أو مثبت x86 executable
(32 بت Python).
تحقق من أنه يعمل باستخدام الأمر python --version
.
python -m pip install nuitka
تحقق باستخدام الأمر python -m nuitka --version
mkdir
HelloWorld
أنشئ ملف بايثون باسم hello.py
def talk(message):return "Talk" + messagedef main():print(talk("Hello World"))if __name__ == "__main__":main()
افعل كما تفعل عادةً. إن تشغيل Nuitka على كود يعمل بشكل غير صحيح ليس من السهل تصحيحه.
بيثون hello.py
بايثون -m nuitka hello.py
ملحوظة
سيطالبك هذا بتنزيل أداة التخزين المؤقت للغة C (لتسريع عملية التجميع المتكررة لرمز C الذي تم إنشاؤه) ومترجم لغة C المستند إلى MinGW64، ما لم يكن لديك برنامج MSVC مناسب مثبتًا. قل yes
لكلا السؤالين.
قم بتنفيذ الملف hello.exe
الذي تم إنشاؤه بالقرب من hello.py
.
للتوزيع، قم بالإنشاء باستخدام خيار --standalone
، والذي لن يُخرج ملفًا واحدًا قابلاً للتنفيذ، بل مجلدًا كاملاً. انسخ المجلد hello.dist
الناتج إلى الجهاز الآخر وقم بتشغيله.
يمكنك أيضًا تجربة --onefile
الذي يقوم بإنشاء ملف واحد، ولكن تأكد من أن الملف المستقل يعمل، قبل اللجوء إليه، لأنه سيجعل تصحيح الأخطاء أكثر صعوبة، على سبيل المثال في حالة فقدان ملفات البيانات.
إذا كنت تريد تجميع برنامج كامل بشكل متكرر، وليس فقط الملف الوحيد الذي يمثل البرنامج الرئيسي، فافعل ذلك على النحو التالي:
python -m nuitka --follow-imports Program.py
ملحوظة
هناك عناصر تحكم أكثر دقة من --follow-imports
المتاحة. خذ بعين الاعتبار مخرجات nuitka --help
. إن تضمين عدد أقل من الوحدات في الترجمة، ولكن بدلاً من ذلك استخدام Python العادي لها، سيجعل عملية الترجمة أسرع.
في حالة وجود دليل مصدر يحتوي على ملفات محملة ديناميكيًا، أي ملف لا يمكن العثور عليه من خلال التكرار بعد عبارات الاستيراد العادية عبر PYTHONPATH
(والتي ستكون الطريقة الموصى بها)، يمكنك دائمًا طلب تضمين دليل معين أيضًا في المجلد قابل للتنفيذ:
python -m nuitka --follow-imports --include-plugin-directory=plugin_dir Program.py
ملحوظة
إذا لم تقم بأي عمليات استيراد ديناميكية، فما عليك سوى تعيين PYTHONPATH
في وقت الترجمة هو ما يجب عليك فعله.
استخدم --include-plugin-directory
فقط إذا قمت بإجراء مكالمات __import__()
التي لا يمكن لـ Nuitka التنبؤ بها، والتي تأتي من دليل، لكل شيء من تثبيت Python الخاص بك، استخدم --include-module
أو --include-package
.
ملحوظة
سيكون اسم الملف الناتج هو program.exe
على نظام التشغيل Windows، program.bin
على الأنظمة الأساسية الأخرى، لكن --output-filename
يسمح بتغيير ذلك.
ملحوظة
لا يزال الثنائي الناتج يعتمد على تثبيت CPython ووحدات امتداد C المستخدمة.
إذا كنت تريد أن تكون قادرًا على نسخه إلى جهاز آخر، فاستخدم --standalone
وانسخ دليل program.dist
الذي تم إنشاؤه وقم بتنفيذ program.exe
(Windows) أو program
(الأنظمة الأساسية الأخرى) الموجود بداخله.
إذا كنت تريد تجميع وحدة امتداد واحدة، كل ما عليك فعله هو ما يلي:
python -m nuitka --module some_module.py
يمكن بعد ذلك استخدام الملف الناتج some_module.so
بدلاً من some_module.py
.
مهم
يجب عدم تغيير اسم الملف الخاص بوحدة الامتداد المنتجة لأن Python تصر على وظيفة مشتقة من اسم الوحدة كنقطة إدخال، وفي هذه الحالة لن يغير PyInit_some_module
وإعادة تسمية الملف ذلك. قم بمطابقة اسم ملف الكود المصدري مع الاسم الثنائي الذي يجب أن يكون عليه.
ملحوظة
إذا كانت وحدة الامتداد والكود المصدري لها موجودين في نفس الدليل، فسيتم تحميل وحدة الامتداد. لن يكون للتغييرات التي يتم إجراؤها على الكود المصدري تأثير إلا بعد إعادة الترجمة.
ملحوظة
يعمل الخيار --follow-import-to
أيضًا، ولكن الوحدات المضمنة لن تصبح قابلة للاستيراد إلا بعد استيراد اسم some_module
. إذا كانت هذه الأنواع من الواردات غير مرئية لـ Nuitka، على سبيل المثال، التي تم إنشاؤها ديناميكيًا، فيمكنك استخدام --include-module
أو --include-package
في هذه الحالة، ولكن بالنسبة لعمليات الاستيراد الثابتة، فلن تكون هناك حاجة إليها.
ملحوظة
لا يمكن أبدًا أن تشتمل وحدة الامتداد على وحدات امتداد أخرى. سيكون عليك إنشاء عجلة حتى يكون هذا ممكنًا.
ملحوظة
لا يمكن تحميل وحدة الامتداد الناتجة إلا في CPython من نفس الإصدار ولا تتضمن وحدات ملحق أخرى.
إذا كنت بحاجة إلى تجميع حزمة كاملة وتضمين جميع الوحدات، فهذا ممكن أيضًا، استخدم Nuitka مثل هذا:
بايثون -m nuitka --module some_package --include-package=some_package
ملحوظة
يجب أن يتم تضمين محتويات الحزمة يدويًا؛ وإلا فإن الحزمة فارغة في الغالب. يمكنك أن تكون أكثر تحديدًا إذا أردت، وقم بتضمين جزء منه فقط، أو استبعاد جزء منه، على سبيل المثال مع --nofollow-import-to='*.tests'
لن تقوم بتضمين الجزء الاختباري غير المستخدم من التعليمات البرمجية الخاصة بك.
ملحوظة
لن يتم تضمين ملفات البيانات الموجودة داخل الحزمة بواسطة هذه العملية، ستحتاج إلى نسخها بنفسك باستخدام هذا الأسلوب. وبدلاً من ذلك، يمكنك استخدام ملف تضمين Nuitka التجاري.
للتوزيع على أنظمة أخرى، يوجد الوضع المستقل، الذي ينتج مجلدًا يمكنك تحديد --standalone
له.
بايثون -m nuitka - برنامج مستقل.py
متابعة جميع الواردات هو الوضع الافتراضي في هذا الوضع. يمكنك استبعاد الوحدات بشكل انتقائي عن طريق قول --nofollow-import-to
على وجه التحديد، ولكن بعد ذلك سيتم ظهور ImportError
عند محاولة استيرادها في وقت تشغيل البرنامج. قد يتسبب هذا في سلوكيات مختلفة، ولكنه قد يؤدي أيضًا إلى تحسين وقت الترجمة إذا تم ذلك بحكمة.
لتضمين ملفات البيانات، استخدم الخيار --include-data-files=<source>=<target>
حيث يكون المصدر هو مسار نظام الملفات، ولكن يجب تحديد الهدف نسبيًا. بالنسبة للوضع المستقل، يمكنك أيضًا نسخها يدويًا، ولكن يمكن أن يؤدي ذلك إلى إجراء فحوصات إضافية، وبالنسبة لوضع الملف الواحد، لا يوجد نسخ يدوي ممكن.
لنسخ بعض أو كل الملفات في الدليل، استخدم الخيار --include-data-files=/etc/*.txt=etc/
حيث يمكنك تحديد أنماط الصدفة للملفات، والدليل الفرعي حيث يمكنك وضعها، كما هو موضح بواسطة شرطة مائلة زائدة.
مهم
لا تعتبر Nuitka ملفات بيانات برمجية، ولا تقم بتضمين ملفات DLL أو ملفات Python كملفات بيانات، وتتوقع منها أن تعمل، فلن تعمل، إلا إذا كنت تعرف حقًا ما تفعله.
فيما يلي، ملفات البيانات غير البرمجية هي جميع الملفات، ولا تتطابق مع أي من هذه المعايير.
لاحقة | الأساس المنطقي | حل |
---|---|---|
.py | يقوم Nuitka بقص حتى الوحدات النمطية stdlib المراد تضمينها. إذا لم يتمكن من رؤية كود بايثون، فلن يتم تحليل التبعيات، ونتيجة لذلك لن يعمل. | استخدم --include-module عليها بدلاً من ذلك |
.pyc | نفس .py . | استخدم --include-module عليهم من كود المصدر الخاص بهم بدلاً من ذلك. |
.pyo | نفس .pyc . | استخدم --include-module عليهم من كود المصدر الخاص بهم بدلاً من ذلك. |
.pyw | نفس .py . | لتضمين برامج متعددة، استخدم وسائط --main متعددة بدلاً من ذلك. |
.pyi | يتم تجاهلها، لأنها تشبه التعليمات البرمجية وليست هناك حاجة إليها في وقت التشغيل. بالنسبة للحزمة lazy التي تعتمد عليها فعليًا، قمنا بإنشاء حل وقت الترجمة الذي يلغي الحاجة. | قم بإثارة مشكلة إذا كان برنامج الجزء الثالث يحتاج إليها. |
.pyx | يتم تجاهلها، لأنها كود مصدر Cython ولا يتم استخدامها في وقت التشغيل | |
.dll | ويتم تجاهل هذه الملفات، لأنها عادةً ليست ملفات بيانات. بالنسبة للحالات التي تستخدم فيها حزم الجهات الخارجية هذه البيانات بالفعل، على سبيل المثال، حزم .NET ، فإننا نحل هذه المشكلة في تكوين الحزمة الخاصة بها. | قم بإنشاء تكوين حزمة Nuitka لهؤلاء، مع قسم dll للحزمة التي تستخدمها. في حالات نادرة، قد يكون قسم ملفات البيانات بتكوين خاص هو الإجراء الصحيح الذي يجب القيام به. |
.dylib | يتم تجاهلها، نظرًا لأنها وحدات ملحقة لنظام التشغيل MacOS أو ملفات DLL. | تحتاج إلى إضافة التكوين مع قسم dll أو depends على ما هو مفقود |
.so | يتم تجاهلها، نظرًا لأنها وحدات امتداد Linux وBSD وما إلى ذلك أو ملفات DLL. | تحتاج إلى إضافة التكوين مع قسم dll أو depends على ما هو مفقود |
.exe | هي الثنائيات لنظام التشغيل Windows. | يمكنك إضافة تكوين حزمة Nuitka لتضمين تلك الملفات كمكتبات DLL ووضع علامة عليها على أنها executable: yes |
.bin | وهي عبارة عن ثنائيات لغير نظام التشغيل Windows، بخلاف ذلك مثل .exe . |
يتم أيضًا تجاهل المجلدات، وهي site-packages
dist-packages
vendor-packages
والتي قد تتضمن بيئة افتراضية كاملة، وهو أمر ليس جيدًا على الإطلاق. ويتم أيضًا تجاهل المجلد __pycache__
دائمًا. في الأنظمة التي لا تعمل بنظام التشغيل MacOS، يتم تجاهل الملف .DS_Store
أيضًا، ويكون لمجلدات py.typed
معنى فقط بالنسبة إلى IDEs، ويتم تجاهله مثل ملفات .pyi
.
لنسخ مجلد كامل يحتوي على جميع الملفات غير البرمجية، يمكنك استخدام --include-data-dir=/path/to/images=images
الذي سيضع تلك الملفات في الوجهة، وإذا كنت تريد استخدام --noinclude-data-files
خيار --noinclude-data-files
لإزالتها. تم توضيح ملفات التعليمات البرمجية كما هو موضح أعلاه في ملفات DLL والملفات التنفيذية وملفات Python وما إلى ذلك وسيتم تجاهلها. بالنسبة لأولئك، يمكنك استخدام النموذج --include-data-files=/binaries/*.exe=binary/
لإجبارهم، ولكن هذا غير مستحسن ومن المعروف أنه يسبب مشكلات في وقت التشغيل.
بالنسبة لبيانات الحزمة، هناك طريقة أفضل، وهي استخدام --include-package-data
، الذي يكتشف جميع ملفات البيانات غير البرمجية الخاصة بالحزم تلقائيًا وينسخها. حتى أنه يقبل الأنماط بأسلوب الصدفة. إنه يوفر عليك الحاجة إلى العثور على دليل الحزمة بنفسك ويجب تفضيله كلما كان ذلك متاحًا. من الناحية الوظيفية، فهو يشبه إلى حد كبير --include-data-dir
ولكن له فائدة في تحديد موقع المجلد الصحيح لك.
مع ملفات البيانات، أنت وحدك إلى حد كبير. تقوم Nuitka بتتبع تلك التي تحتاجها الحزم الشائعة، ولكنها قد تكون غير مكتملة. اطرح المشكلات إذا واجهت شيئًا ما في هذه الأمور. والأفضل من ذلك، رفع العلاقات العامة من خلال التحسينات على تكوين حزمة Nuitka. نريد أن تعمل برامج الطرف الثالث خارج الصندوق.
عندما ينجح ذلك، يمكنك استخدام وضع الملف الواحد إذا كنت ترغب في ذلك.
بايثون -m nuitka --onefile Program.py
سيؤدي هذا إلى إنشاء ثنائي واحد، يستخرج نفسه على الهدف، قبل تشغيل البرنامج. لكن لاحظ أن الوصول إلى الملفات المتعلقة ببرنامجك يتأثر، تأكد من قراءة القسم Onefile: البحث عن الملفات أيضًا.
# أنشئ ملفًا ثنائيًا يتم فك حزمه في مجلد مؤقت python -m nuitka --onefile Program.py
ملحوظة
هناك المزيد من الخيارات الخاصة بالنظام الأساسي، على سبيل المثال، ما يتعلق بالأيقونات وشاشة البداية ومعلومات الإصدار، فكر في إخراج --help
للحصول على تفاصيل هذه وتحقق من قسم التعديلات.
بالنسبة لتفريغ الحزمة، يتم استخدام مسار مؤقت فريد للمستخدم بشكل افتراضي، ثم يتم حذفه، ولكن هذا الافتراضي --onefile-tempdir-spec="{TEMP}/onefile_{PID}_{TIME}"
يمكن تجاوزه بمسار المواصفات، ثم استخدام مسار مخبأ، وتجنب التفريغ المتكرر، على سبيل المثال مع --onefile-tempdir-spec="{CACHE_DIR}/{COMPANY}/{PRODUCT}/{VERSION}"
الذي يستخدم معلومات الإصدار ودليل ذاكرة التخزين المؤقت الخاصة بالمستخدم.
ملحوظة
سيكون استخدام المسارات المخزنة مؤقتًا ذا صلة، على سبيل المثال، عندما يتم تشغيل جدار حماية Windows، وإلا فإن الملف الثنائي سيكون مختلفًا عنه في كل مرة يتم تشغيله.
حاليًا، تتوفر هذه الرموز المميزة الموسعة:
رمز مميز | ما هذا يتوسع إلى | مثال |
---|---|---|
{درجة حرارة} | دليل الملفات المؤقتة للمستخدم | ج: المستخدمون...AppDataLocalsTemp |
{معرف المنتج} | معرف العملية | 2772 |
{وقت} | الوقت بالثواني منذ العصر. | 1299852985 |
{برنامج} | اسم الملف الكامل لوقت تشغيل البرنامج القابل للتنفيذ. | C:SomeWhereYourOnefile.exe |
{PROGRAM_BASE} | لا توجد لاحقة لاسم ملف وقت التشغيل القابل للتنفيذ. | ج: SomeWhereYourOnefile |
{CACHE_DIR} | دليل ذاكرة التخزين المؤقت للمستخدم. | ج: المستخدمونSomeBodyAppDataLocal |
{شركة} | القيمة المعطاة كـ --company-name | اسم شركتك |
{منتج} | القيمة المعطاة كـ --product-name | اسم المنتج الخاص بك |
{إصدار} | مزيج من --file-version و- --product-version | 3.0.0.0-1.0.0.0 |
{بيت} | الدليل الرئيسي للمستخدم. | /الصفحة الرئيسية/شخص ما |
{لا أحد} | عند توفيره لمخرجات الملف، يتم استخدام None | انظر الإشعار أدناه |
{باطل} | عند توفيره لمخرجات الملف، يتم استخدام os.devnull | انظر الإشعار أدناه |
مهم
تقع على عاتقك مسؤولية جعل المسار المقدم فريدًا، وسيتم قفل البرنامج قيد التشغيل على Windows، وأثناء استخدام اسم مجلد ثابت، يمكن أن يتسبب ذلك في حدوث مشكلات في القفل في هذه الحالة، حيث تتم إعادة تشغيل البرنامج.
عادةً، تحتاج إلى استخدام {TIME}
أو {PID}
على الأقل لجعل المسار فريدًا، وهذا مخصص بشكل أساسي لحالات الاستخدام، حيث تريد، على سبيل المثال، وضع الأشياء في مكان تختاره أو الالتزام باصطلاحات التسمية الخاصة بك.
مهم
لتعطيل الإخراج وstderr باستخدام --force-stdout-spec
و --force-stderr-spec
تحقق القيمتان {NONE}
و {NULL}
ذلك، ولكن بتأثير مختلف. مع {NONE}
، يصبح المقبض المقابل None
. ونتيجة لذلك، على سبيل المثال، sys.stdout
سيكون None
، وهو يختلف عن {NULL}
حيث سيتم دعمه بملف يشير إلى os.devnull
، أي يمكنك الكتابة إليه.
باستخدام {NONE}
، قد تحصل على سبيل المثال على RuntimeError: lost sys.stdout
في حالة استخدامه؛ مع {NULL}
هذا لا يحدث أبدًا. ومع ذلك، تتعامل بعض المكتبات مع هذا كمدخل لآلية التسجيل الخاصة بها، وهذه هي الطريقة التي تتوافق بها على نظام التشغيل Windows مع pythonw.exe
الذي يتصرف مثل {NONE}
.
إذا كان لديك setup.py
أو setup.cfg
أو pyproject.toml
لإنشاء عجلات لبرنامجك، فإن استخدام Nuitka أمر سهل للغاية.
لنبدأ بأسلوب setuptools
الأكثر شيوعًا، يمكنك، بعد تثبيت Nuitka بالطبع، تنفيذ الهدف bdist_nuitka
بدلاً من bdist_wheel
. فهو يأخذ جميع الخيارات ويسمح لك بتحديد المزيد من الخيارات الخاصة بـ Nuitka.
# بالنسبة إلى setup.py إذا كنت لا تستخدم أنظمة إنشاء أخرى:setup( # يجب التعامل مع ملفات البيانات بواسطة أدوات الإعداد وليس بواسطة Nuitka package_data={"some_package": ["some_file.txt"]}, ..., # هذا لتمرير خيارات Nuitka. Command_options={ 'nuitka': { # خيار منطقي، على سبيل المثال، إذا كنت تهتم بأوامر تجميع C '--show-scons': صحيح، # خيارات بدون قيمة، على سبيل المثال فرض استخدام Clang '--clang': لا شيء، # خيارات مع قيم فردية، على سبيل المثال تمكين مكون إضافي لـ Nuitka '-enable-plugin': "pyside2"، # خيارات ذات قيم متعددة، على سبيل المثال تجنب تضمين الوحدات النمطية '--nofollow-import-to' : ["*.tests"، "*.distutils"]، }, }, )# بالنسبة إلى setup.py مع أنظمة البناء الأخرى:# الطبيعة المصفوفية للوسائط مطلوبة بسبب الطبيعة المظلمة لـ # "setuptools" والمكونات الإضافية لها، والتي تصر على التوافق الكامل، # على سبيل المثال "setuptools_rust"setup( # Data files يجب أن يتم التعامل معها بواسطة أدوات الإعداد وليس Nuitka package_data={"some_package": ["some_file.txt"]}, ..., # هذا لتمرير خيارات Nuitka. ..., Command_options={ 'nuitka': { # خيار منطقي، على سبيل المثال، إذا كنت تهتم بأوامر تجميع C '--show-scons': ("setup.py"، True)، # خيارات بدون قيمة، على سبيل المثال فرض استخدام Clang '--clang': ("setup.py"، لا شيء)، # خيارات ذات قيم فردية، على سبيل المثال تمكين مكون إضافي لـ Nuitka '--enable-plugin': ("setup.py"، "pyside2"))، # خيارات ذات قيم متعددة، على سبيل المثال تجنب تضمين الوحدات النمطية '--nofollow-import-to' : ("setup.py"، ["*.tests"، "*.distutils"])، } }, )
إذا لم تتمكن أو لا ترغب في تغيير الهدف لسبب ما، فيمكنك إضافة هذا إلى setup.py
الخاص بك.
# بالنسبة إلى setup.pysetup( ...، build_with_nuitka = صحيح)
ملحوظة
لتعطيل الترجمة مؤقتًا، يمكنك إزالة السطر أعلاه، أو تحرير القيمة إلى False
أو أخذ قيمتها من متغير بيئة إذا اخترت ذلك، على سبيل المثال bool(os.getenv("USE_NUITKA", "True"))
. هذا متروك لك.
أو يمكنك وضعه في setup.cfg
الخاص بك
[البيانات الوصفية]build_with_nuitka = صحيح
وأخيرًا وليس آخرًا، يدعم Nuitka أيضًا البنية build
الجديدة، لذا عندما يكون لديك pyproject.toml
بالفعل، ما عليك سوى استبدال هذه القيمة أو إضافتها:
[build-system]requires = ["setuptools>=42"، "wheel"، "nuitka"، "toml"]build-backend = "nuitka.distutils.Build"# يجب التعامل مع ملفات البيانات بواسطة أدوات الإعداد وليس Nuitka [tool.setuptools.package-data]some_package = ['data_file.txt'] [tool.nuitka]# لا يُنصح باستخدامها، ولكنها توضح أن لها تأثيرًا.# خيار منطقي، على سبيل المثال، إذا كنت مهتمًا بأوامر ترجمة لغة C، فسيتم حذف # الشرطات البادئةshow-scons = true# options مع قيم مفردة، على سبيل المثال تمكين مكون إضافي لـ Nuitkaenable-plugin = "pyside2"# خيارات ذات قيم متعددة، على سبيل المثال، تجنب تضمين الوحدات النمطية، يقبل # list الوسيطة.nofollow-import-to = ["*.الاختبارات"، "*.distutils"]
ملحوظة
بالنسبة لمتطلبات nuitka
فوق المسارات المطلقة مثل C:Users...Nuitka
أيضًا على Linux، استخدم مسارًا مطلقًا بشرطتين مائلتين، على سبيل المثال //home/.../Nuitka
.
ملحوظة
ومهما كان النهج الذي تتبعه، فإن ملفات البيانات الموجودة في هذه العجلات لا يتم التعامل معها بواسطة Nuitka على الإطلاق، ولكن بواسطة أدوات الإعداد. ومع ذلك، يمكنك استخدام تضمين ملف البيانات الخاص بإعلان Nuitka. في هذه الحالة، ستقوم فعليًا بتضمين الملفات داخل وحدة الامتداد نفسها، وليس كملف في العجلة.
إذا كان لديك برامج متعددة، يجب أن يكون كل منها قابلاً للتنفيذ، في الماضي كان عليك تجميعها عدة مرات ونشرها جميعًا. مع الوضع المستقل، هذا يعني بالطبع أنك كنت مسرفًا إلى حد ما، حيث يمكن القيام بمشاركة المجلدات، ولكن لم يكن Nuitka مدعومًا حقًا.
أدخل Multidist
. يوجد خيار --main
يستبدل أو يضيف إلى الوسيطة الموضعية المعطاة. ويمكن إعطاؤه عدة مرات. عند إعطائه عدة مرات، سيقوم Nuitka بإنشاء ملف ثنائي يحتوي على رمز جميع البرامج المقدمة، ولكن مشاركة الوحدات المستخدمة فيها. ولذلك لا يلزم توزيعها عدة مرات.
دعنا نسمي الاسم الأساسي للمسار الرئيسي ونقطة الدخول. وبطبيعة الحال، يجب أن تكون أسماء هذه مختلفة. بعد ذلك، يمكن للثنائي الذي تم إنشاؤه تنفيذ أي من نقطتي الإدخال، وسوف يتفاعل مع ما يظهر له sys.argv[0]
. لذا، إذا تم تنفيذه بالطريقة الصحيحة (باستخدام شيء مثل subprocess
أو OS API، يمكنك التحكم في هذا الاسم)، أو عن طريق إعادة تسمية الملف الثنائي أو نسخه، أو الارتباط به، يمكنك بعد ذلك تحقيق المعجزة.
وهذا يسمح بدمج برامج مختلفة جدًا في برنامج واحد.
ملحوظة
هذه الميزة لا تزال تجريبية. استخدمه بعناية وأبلغ عن النتائج التي توصلت إليها إذا واجهت أي سلوك غير مرغوب فيه
يعمل هذا الوضع مع تسريع مستقل وملف واحد ومجرد. أنها لا تعمل مع وضع الوحدة النمطية.
للتكامل مع سير عمل GitHub، يوجد Nuitka-Action الذي يجب عليك استخدامه والذي يجعل التكامل سهلًا حقًا. يجب أن تبدأ بالتجميع المحلي، لكن هذا سيكون أسهل للتجميع عبر المنصات باستخدام Nuitka.
هذا مثال لسير العمل الذي يعتمد على جميع أنظمة التشغيل الثلاثة
الوظائف:بناء: إستراتيجية: مصفوفة: نظام التشغيل: [macos-latest, ubuntu-latest, windows-latest] يعمل على: ${{ Matrix.os }} خطوات: - الاسم: يستخدم مستودع السحب: Actions/checkout@v4 - الاسم: يستخدم إعداد Python: Actions/setup-python@v5 مع: إصدار python: ذاكرة التخزين المؤقت '3.10': مسار تبعية ذاكرة التخزين المؤقت 'pip': | **/requirements*.txt - الاسم: تثبيت التبعيات الخاصة بك، تشغيل: | تثبيت النقطة -r المتطلبات.txt -r المتطلبات-dev.txt - الاسم: إنشاء ملف قابل للتنفيذ باستخدام استخدامات Nuitka: Nuitka/Nuitka-Action@main مع: nuitka-version: main script-name: your_main_program.py # العديد من خيارات Nuitka المتاحة ، راجع مستند الإجراء، ولكن من الأفضل # استخدام خيارات nuitka-project: في التعليمات البرمجية الخاصة بك، لذلك، على سبيل المثال، يمكنك إحداث # فرق في نظام التشغيل macOS وإنشاء حزمة تطبيقات هناك. ملف واحد: صحيح - الاسم: يستخدم تحميل القطع الأثرية: الإجراءات/upload-artifact@v3 مع: الاسم: ${{ runner.os }} مسار البناء: | # تطابق ما تم إنشاؤه لأنظمة التشغيل الثلاثة build/*.exe build/*.bin build/*.app/**/*
إذا كان تطبيقك عبارة عن واجهة مستخدم رسومية، على سبيل المثال، يجب أن يحتوي your_main_program.py
على هذه التعليقات كما هو موضح في خيارات Nuitka في الكود حيث أنه في نظام التشغيل macOS، يجب أن يكون ذلك حزمة.
# وضع التجميع، مستقل في كل مكان، باستثناء نظام التشغيل macOS، هناك حزمة تطبيقات# nuitka-project-if: {OS} in ("Windows"، "Linux"، "FreeBSD"):# nuitka-project: --onefile# nuitka-project -if: {OS} == "Darwin":# nuitka-project: --standalone# nuitka-project: --macos-create-app-bundle#
للحصول على مظهر جيد، يمكنك تحديد الرموز. في نظام التشغيل Windows، يمكنك توفير ملف رمز أو قالب قابل للتنفيذ أو ملف PNG. كل هذه الأشياء ستعمل وربما يتم دمجها:
# يقوم هذا بإنشاء ثنائيات تحتوي على أيقونات على Windowspython -m nuitka --onefile --windows-icon-from-ico=your-icon.png Program.py python -m nuitka --onefile --windows-icon-from-ico=your-icon.icoprogram.py python -m nuitka --onefile --windows-icon-template-exe=your-icon.icoprogram.py# يقوم هذا بإنشاء حزم التطبيقات مع الرموز على macOSpython -m nuitka --macos-create-app-bundle --macos- app-icon=your-icon.pngprogram.py python -m nuitka --macos-create-app-bundle --macos-app-icon=your-icon.icnsprogram.py
ملحوظة
مع Nuitka، لا يتعين عليك إنشاء أيقونات خاصة بالمنصة، ولكن بدلاً من ذلك ستحول على سبيل المثال PNG، ولكن أيضًا التنسيقات الأخرى أثناء الإنشاء.
يمكن إضافة استحقاقات حزمة تطبيق macOS باستخدام الخيار --macos-app-protected-resource
، ويتم إدراج جميع القيم في هذه الصفحة من Apple
قد تكون قيمة المثال --macos-app-protected-resource=NSMicrophoneUsageDescription:Microphone access
لطلب الوصول إلى الميكروفون. بعد النقطتين، يجب إعطاء النص الوصفي.
ملحوظة
انتبه إلى أنه في الحالة المحتملة لاستخدام المسافات في جزء الوصف، ستحتاج إلى اقتباسها حتى تتمكن الصدفة الخاصة بك من الوصول إلى Nuitka ولا يتم تفسيرها على أنها وسيطات Nuitka.
في نظام التشغيل Windows، لا يتم فتح وحدة التحكم بواسطة البرامج إلا إذا طلبت ذلك. يقوم Nuitka افتراضيًا بعدم إظهاره، ويمكنك إجباره باستخدام --console=force
بالرغم من ذلك، ثم سيفتح البرنامج نافذة طرفية جديدة عند تنفيذه.
تكون شاشات البداية مفيدة عندما يكون بدء تشغيل البرنامج بطيئًا. بدء تشغيل Onefile في حد ذاته ليس بطيئًا، ولكن قد يكون برنامجك بطيئًا، ولا يمكنك حقًا معرفة مدى سرعة الكمبيوتر المستخدم، لذلك قد يكون الحصول عليه فكرة جيدة. لحسن الحظ، مع Nuitka، من السهل إضافتها لنظام التشغيل Windows.
بالنسبة لشاشة البداية، تحتاج إلى تحديدها كملف PNG، ثم التأكد من تعطيل شاشة البداية عندما يكون برنامجك جاهزًا، على سبيل المثال، أكمل عمليات الاستيراد، وأعد النافذة، ومتصل بقاعدة البيانات، ويريد شاشة البداية للذهاب بعيدا. نحن هنا نستخدم بناء جملة المشروع لدمج الكود مع الإنشاء، وقم بتجميع هذا:
# nuitka-project: --onefile# nuitka-project: --onefile-windows-splash-screen-image={MAIN_DIRECTORY}/Splash-Screen.png# أيًا كان هذا، فمن الواضح أن print("تأخير بدء التشغيل بمقدار 10 ثوانٍ..." )import time, tempfile, ostime.sleep(10)# استخدم هذا الرمز للإشارة إلى إزالة شاشة البداية.if "NUITKA_ONEFILE_PARENT" في os.environ:splash_filename = os.path.join( tempfile.gettempdir(), "onefile_%d_splash_feedback.tmp" % int(os.environ["NUITKA_ONEFILE_PARENT"]), ) إذا كان os.path.exists(splash_filename): os.unlink(splash_filename)print("تم...يجب أن تختفي البقعة."") ...# بقية برنامجك تذهب هنا.
لتحليل برنامجك وتعبئة Nuitka، يتوفر تقرير التجميع. يمكنك أيضًا إنشاء تقارير مخصصة من خلال توفير القالب الخاص بك، مع وجود عدد قليل منها مدمج في Nuitka. تحمل هذه التقارير جميع المعلومات التفصيلية، على سبيل المثال، عند محاولة استيراد وحدة نمطية، ولكن لم يتم العثور عليها، يمكنك معرفة أين يحدث ذلك. للإبلاغ عن الأخطاء، يوصى بشدة بتقديم التقرير.
يمكنك إرفاق معلومات حقوق الطبع والنشر والعلامة التجارية واسم الشركة واسم المنتج وما إلى ذلك إلى مجموعتك. يتم بعد ذلك استخدام هذا في معلومات الإصدار للملف الثنائي الذي تم إنشاؤه على نظام التشغيل Windows، أو حزمة التطبيق على نظام التشغيل macOS. إذا وجدت شيئًا ناقصًا، فيرجى إخبارنا بذلك.
بشكل افتراضي، يتم تجميع Nuitka بدون --deployment
مما يترك مجموعة من أدوات الحماية والمساعدين الآمنة قيد التشغيل، والتي تهدف إلى تصحيح الاستخدامات الخاطئة لـ Nuitka.
هذه ميزة جديدة، وتنفذ مجموعة من وسائل الحماية والمساعدات، الموثقة هنا.
لذا، بعد التجميع، يكون sys.executable
هو الملف الثنائي المترجم. في حالة حزم مثل multiprocessing
، أو joblib
، أو loky
فإن ما يفعله هؤلاء عادة هو توقع الركض من python
كامل مع sys.executable
ومن ثم أن تكون قادرًا على استخدام خياراتها مثل -c command
أو -m module_name
ثم تكون قادرًا على ذلك قم بتشغيل رمز آخر مؤقتًا أو دائمًا كخفي خدمة.
ومع ذلك ، فإن هذا ينفذ برنامجك مرة أخرى ، ويضع هذه الحجج ، في sys.argv
حيث ربما تتجاهلها ، ثم تتخبط نفسك مرة أخرى لبدء شياطات المساعد. في بعض الأحيان ، ينتهي هذا الأمر بتفريغ عمليات حساب وحدة المعالجة المركزية التي تفرخ عمليات حساب وحدة المعالجة المركزية التي ... وهذا ما يسمى قنبلة شوكة ، ومع جميع الأنظمة تقريبًا ، التي تجمدها بسهولة حتى الموت.
هذا هو السبب على سبيل المثال يحدث هذا مع Nuitka الافتراضي:
./hello.dist خطأ ، حاول البرنامج استدعاء نفسه بحجة "-M". تعطيل مع '-no-deployment-flag = التنفيذ الذاتي'.
قد يكون لدى البرنامج تحليل سطر الأوامر الخاص به ، ولا يستخدم حزمة غير مدعومة تحاول إعادة التنفيذ. في هذه الحالة ، تحتاج إلى وقت الترجمة للاستخدام --no-deployment-flag=self-execution
الذي يعطل هذا الحارس المحدد.
بعض الحزم تخرج ما يعتقدون أنه معلومات مفيدة حول سبب الفشل الذي قد يعنيه الاستيراد. مع البرامج المترجمة ، غالبًا ما يكون هناك خطأ واضح. نحاول إصلاح تلك الموجودة في وضع عدم النشر. فيما يلي مثال ، حيث نقوم بتغيير رسالة تطلب تثبيت PIP (وهو ليس المشكلة) لتوجيه المستخدم إلى الأمر الذي يجعل مكونًا إضافيًا imageio
يعمل.
- اسم الوحدة النمطية: "imageio.core.imopen" معاداة: -replacements_plain: '`pip install imageio [{config.install_name}]` لتثبيته': '`--in-in-module = {config.module_name}` مع nuitka لتضمين it'er_type = exporterror': 'err_type = Runtimeerror "عندما:" لا النشر "
وضع النشر جديد نسبيًا ويحتوي على المزيد من الميزات باستمرار ، على سبيل المثال ، يجب أن يكون هناك شيء بالنسبة لـ FileNotFoundError
قريبًا.
بالطبع يمكن تعطيل كل هؤلاء المساعدين في وقت واحد --deployment
ولكن ضع في اعتبارك أنه من أجل تصحيح الأخطاء ، قد ترغب في إعادة تمكينه. قد ترغب في استخدام خيارات مشروع Nuitka ومتغير البيئة لجعل هذا المشروع.
هل يجب عليك تعطيلهم جميعًا؟
نعتقد أن التعطيل يجب أن يحدث بشكل انتقائي فقط ، ولكن مع ترقيات PYPI ، فإن تغييرات الكود الخاصة بك ، وكل هذه المشكلات يمكن أن تتسلل إلى الوراء. إن توفير المساحة لوضع النشر ضئيل حاليًا ، لذا حاول عدم القيام بذلك ، ولكن مراجعة ما هو موجود ، و إذا كنت تعلم أنه لا يمكن أن يؤثر عليك ، أو إذا حدث ذلك ، فلن تحتاج إليه. من الواضح أن بعض من المستقبلين ، سيتم توجيههم عند استخدام مستوى المبتدئين.
قد يتم التعرف على الثنائيات التي تم تجميعها على Windows مع إعدادات افتراضية لـ Nuitka ولا يتم التعرف على أي إجراءات أخرى من قبل بعض بائعي AV كبرامج ضارة. يمكن تجنب هذا ، ولكن فقط في Nuitka Commercial ، هناك دعم فعلي وتعليمات لكيفية القيام بذلك ، واعتبر ذلك كحتاج تجاري نموذجي فقط. https://nuitka.net/doc/commercial.html
بالنسبة إلى Linux المستقل ، من الصعب جدًا بناء ثنائي يعمل على إصدارات Linux الأخرى. ويرجع ذلك أساسًا إلى أنه على نظام Linux ، تم تصميم الكثير من البرامج على وجه التحديد إلى DLLs الملموسة. يتم بعد ذلك ترميز أشياء مثل GLIBC المستخدمة في الثنائي ، ولن يتم تشغيلها باستخدام GLIBC أقدم ، فقط لإعطاء مثال حاسم.
الحل هو البناء على أقدم نظام التشغيل الذي تريد رؤيته مدعومًا. يمكن أن يكون اختيار ذلك وإعداده مملاً ، لذلك يمكن تسجيل الدخول والاحتفاظ به