الوصول إلى برنامج Py2exe عبر الشبكة في نظام التشغيل Windows 98 يلقي بالمواد الديمقراطية

StackOverflow https://stackoverflow.com/questions/2009873

سؤال

أنا أقوم بتشغيل برنامج Python مترجم Py2exe من جهاز خادم واحد على عدد من الأجهزة العميلة (المعينة إلى محرك أقراص شبكة على كل جهاز، قل W :).

بالنسبة لنظام التشغيل Windows XP والأجهزة اللاحقة، لم يكن لديك حتى الآن مشاكل صفرية مع Python التقاط W: python23.dll (نعم، أنا أستخدم Python 2.3.5 لتوافق W98 وكل ذلك). سيتم بعد ذلك استخدام W: Zlib.pyd لإلغاء ضغط W: Library.zip تحتوي على جميع ملفات .pyc مثل OS ومثل هذه، والتي يتم استيرادها ثم لا يعمل البرنامج أي مشاكل.

المشكلة التي أحصل عليها هي في بعض آلات Windows 98 SE (ملاحظة: بعض آلات Windows 98 SE، والبعض الآخر يبدو للعمل مع عدم وجود مشاكل واضحة). ما يحدث هو، يعمل البرنامج من W :، W: python23.dll، أفترض، وجدت (منذ أن أحصل على python promportrors، كنا بحاجة إلى أن نكون قادرين على تنفيذ بيان استيراد بيثون)، ولكن زوجين من الأشياء لا تعمل:

1) إذا كانت W: library.zip تحتوي على نسخة فقط من ملفات .pyc، أحصل عليهاZipImportError: can't decompress data; zlib not available (هراء، بالنظر إلى W: Zlib.pyd متاح ويعمل بشكل جيد مع أجهزة XP والأعلى على نفس الشبكة).

2) إذا تم تحقيق ملفات .pyc بالفعل داخل Python Exe by Py2exe، أو وضعت في نفس الدليل مثل .exe، أو وضعت في دليل فرعي مسمى ثم يتم تعيينه بعد ذلك كجزء من متغير PythonPath (مثل W: Pylib )، انا حصلت ImportError: no module named os (نظام التشغيل هو الوحدة الأولى المستوردة، قبل SYS وأي شيء آخر).

تعال إلى التفكير في الأمر، لن يكون sys.path متاحا للبحث إذا تم استيراد نظام التشغيل قبل ذلك ربما؟ سأحاول تحويل ترتيب تلك الواردات ولكن سؤالي لا يزال يقف: لماذا هذه مشكلة متفرقة، تعمل على بعض الشبكات ولكن ليس على الآخرين؟ وكيف يمكنني إجبار Python على العثور على الملفات المجمعة داخل الجري القابل للتنفيذ جدا؟ لدي إمكانية الوصول الفوري إلى جهاز Windows 98 SE يعمل، لكنني أحصل فقط على الوصول إلى الشخص غير العام (عميل لي) كل صباح قبل أن يفتح متجرهم.

شكرا مقدما!


تحرير: حسنا، خطوة كبيرة إلى الأمام. بعد تصحيح الأخطاء مع py2exe_verbose، فإن المشكلة التي تحدث على الجهاز W98SE معين هو أنه لا يستخدم بناء جملة المسار الصحيح عند البحث عن الواردات. أولا، لا يبدو أنه يقرأ متغير بيئة PythonPath (قد يكون هناك واحد خاص ب Py2exe أنا غير مدرك، مثل py2exe_verbose).

ثانيا، يبدو فقط في مكان واحد قبل الاستسلام (إذا تم تجميع الملفات داخل EXE، فهو يبدو هناك. إذا لم يكن الأمر كذلك، فهو يبدو في Library.zip).

تحرير 2.: في الواقع، وفقا ل هذه, ، هناك فرق بين sys.path في مترجم الثعبان وذلك من الملفات التنفيذية py2exe. خاصة، sys.path contains only a single entry: the full pathname of the shared code archive. بلاه. لا الغسل؟ ليس حتى دليل العمل الحالي؟ سأحاول إضافة W:\ إلى المسار، لكن PY2EXE لا يتوافق مع أي نوع من المعايير لتحديد موقع مكتبات النظام، لذلك لن يعمل.

الآن لتقليل قليلا. المسار الذي يحاول تحميل atexit، نظام التشغيل، إلخ. من هو:

W:\\library.zip\<module>.<ext>

لاحظ الخط المائل الفردي بعد Library.zip، ولكن الخط المائل المزدوج بعد حرف محرك الأقراص (شخص يصححني إذا كان هذا المقصود وينبغي أن يعمل). يبدو أنه إذا كانت هذه سلسلة حرفية، فما لم يتضاعف الشرط، فإنه يقرأ بمثابة تسلسل الهروب (غير صالح) ويتم طباعة الأحرف الخام (العطاء W:\library.zipos.pyd, W:\library.zipos.dll, ... بدلا من مائل)؛ إذا لم تكن حرفية حرفية، فقد لا يكون الشرطة المزدوجة Normath'd تلقائيا (كما يجب أن يكون)، وبالتالي فإن الشرائح المزدوجة تربك محمل الوحدة النمطية. كما قلت، لا أستطيع فقط set PYTHONPATH=W:\\library.zip\\ لأنه يتجاهل هذا المتغير.

قد يكون الأمر يستحق استخدام Sys.Path.Append في بداية البرنامج الخاص بي، لكن مسارات الوحدة النمطية الترميز الثابتة هي منتجع آخر مطلق، خاصة وأن المشكلة تحدث في تكوين نظام واحد قديم.

أيه أفكار؟ لدي واحد، وهو أمر يعني sys.path.. شفقة أحتاج os من أجل هذا. آخر هو مجرد إلحاق os.getenv('PATH') أو os.getenv('PYTHONPATH') إلى sys.path ... مرة أخرى، تحتاج os وحدة. ال site فشلت الوحدة النمطية أيضا في الوفارة، لذلك لا يمكنني استخدام ملف .pth.

لقد جربت مؤخرا التعليمات البرمجية التالية في بداية البرنامج:

for pth in sys.path:
    fErr.write(pth)
    fErr.write(' to ')
    pth.replace('\\\\','\\') # Fix Windows 98 pathing issues
    fErr.write(pth)
    fErr.write('\n')

ولكن لا يمكن تحميل Linecache.pyc، أو أي شيء آخر لهذه المسألة؛ لا يمكن فعلا تنفيذ تلك الأوامر من مظهر الأشياء. هل هناك أي طريقة لاستخدام الوظائف المدمجة التي لا تحتاج إلى LineCache لتعديل sys.path ديناميكيا؟ أو أنا خفضت إلى الترميز الصعب sys.path الصحيح؟

هل كانت مفيدة؟

المحلول 2

لم تعد المشكلة مشكلة بالنسبة لي، لقد وجدت حل بديل (قد يكون أو لا يشارك في ترك وظيفتي هناك). قبول هذه الإجابة حتى يمكن لشخص آخر تقديم حل أكثر مرضية.

نصائح أخرى

هذه ليست إجابة مباشرة، ولكن ربما بعض المساعدة. هل أنت على دراية -v الخيار في بيثون. اكتب python -h لتعلم المزيد. لاحظ ما يعادل PYTHONVERBOSE متغير البيئة لبرامج النصوص Py2exe PY2EXE_VERBOSE, ، كما هو موضح في أي مكان تقريبا إلا في هذا المنشور من قبل مؤلفها. وبعد يبدو أنه يمكن أن تأخذ قيم 1 أو 2، مثل أساسا -v و -vv, ، على الرغم من أن هذا يختلف قليلا عن كيف يعمل Pythonverbose.

لاحظ أيضا حول فكرة Sys.Path: ما إذا كنت قد استوردت sys بالفعل أو لا يكون لها أي تأثير على ما إذا كان يمكنك استيراد os. وبعد هذا هو، مسار بيثون (مرئي في sys.path) متاح دائما، بمعنى أنه يعكس ميزة داخلية من المترجم الذي يوجد ما إذا كنت قد استوردت وحدة SYS أو لا.

كما هو الحال مع عدد من الوحدات الأخرى، sys مدمج، لذلك يجب أن يكون دائما مستورد حتى لو كان تطبيقك يشعر تماما. إذا كان سيساعد، فقد تكون قادرا على استخدام sys.builtin_module_names لمعرفة ما هم للحصول على نسخة الخاص بك من بيثون. إذا كان المترجم يعمل على الإطلاق، فستكون المعلومات متاحة، لذلك قد يكون ما يلي هو أصغر برنامج مفيد يمكنك تقديمه لمعرفة ما حصلت عليه:

import sys
print sys.builtin_module_names

أيضا، أنا أنصح ضد محاولة أي شيء يتوهم مثل تجميع الملفات .pyc داخل .exe. لقد حصلت بالفعل على ما يكفي من العمل ضدك بسبب دعم WIN98، وإذا كنت أنت كنت سأذهب لأبسط نهج من شأنه أن يسمح لي بالحصول على المهمة والانتقال إلى مناطق أكثر إثارة للاهتمام. إذا كنت تستطيع فقط تثبيت Python بشكل طبيعي وتشغيلها من المصدر، يجب عليك بالتأكيد النظر فيها! :)

تحريرها لتشمل الرابط إلى معلومات Py2exe_verbose لكل تعليق بواسطة Darvids0n.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top