كيف يمكنني تصحيح تطبيق PY2EXE فشل في تهيئة الخطأ بشكل صحيح؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

أنا جديد جدا على Python بشكل عام، لكنني قمت بتطبيق في Python 2.6 / Wxpython 2.8 الذي يعمل تماما عند تشغيله عبر Python. لكنني أردت أن أذهب إلى الخطوة وأيضا أن أكون قادرا على نشره ك Windows قابل للتنفيذ، لذلك كنت أحاول الخروج Py2exe. لكنني لم أتمكن من الحصول عليها للعمل. سيكون دائما ترجمة EXE، ولكن عندما أحاول فعلا تشغيل أنه ينبح بعض رسالة الخطأ الخبيثة. في البداية كانت رسائل بسيطة تقول إنها لا تستطيع إيجاد DLLs معينة، ولكن حتى بعد إعطائها جميع DLLs أرادها، فإنه يعيد هذا الآن:

The application failed to initialize properly (0xc0000142).
Click OK to terminate the application.

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

import wx

class MainWindow(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, wx.ID_ANY, title, style=wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)
        panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE)
        main_sizer = wx.BoxSizer(wx.VERTICAL)

        testtxt = wx.StaticText(panel, -1, label='This is a test!')
        main_sizer.Add(testtxt, 0, wx.ALIGN_CENTER)

        panel.SetSizerAndFit(main_sizer)
        self.Show(1)
        return

app = wx.PySimpleApp()
frame = MainWindow(None, -1, 'Test App')
app.MainLoop()

وهنا البرنامج النصي Setup Py2exe الذي استخدمته:

#!/usr/bin/python

from distutils.core import setup
import py2exe

manifest = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
    version="0.64.1.0"
    processorArchitecture="x86"
    name="Controls"
    type="win32"
/>
<description>Test Program</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
"""

setup(
    windows = [
        {
            "script": "testme.py",
            "icon_resources": [(1, "testme.ico")],
            "other_resources": [(24,1, manifest)]
        }
    ],
  data_files=["testme.ico"]

)

ثم أركض python setup.py py2exe, ، يقوم بإنشاء ملف EXE، يحذر من بعض ملفات DLL (التي نسخت لاحقا إلى Dist Directory)، ولكن بعد ذلك عندما أحاول تشغيل EXE، أحصل على الخطأ الذي اقتبته أعلاه على الفور.

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

المحلول

لاحظ أن هناك إصدار لاحق من حزمة إعادة توزيع Visual C ++ لعام 2008: SP1.. وبعد ومع ذلك، لا يقوم كل من SP1 والإصدار السابق بتثبيت DLLS في المسار. كما تقول صفحة التنزيل (التركيز الخاص بي):

تقوم هذه الحزمة بتثبيت مكونات وقت التشغيل في وقت التشغيل C (CRT)، C ++، ATL، ATL، MFC، OpenMP ومكتبات MSDIA. بالنسبة للمكتبات التي تدعم نموذج النشر الجانبي (CRT، SCL، ATL، MFC، OpenMP) في ذاكرة التخزين المؤقت للأمم المحلية، تسمى أيضا مجلد Winsxs, ، على إصدارات نظام التشغيل Windows الذي يدعم المجالس الجانبية.

من المحتمل أن تجد هذه الملفات في %WINDIR%\WinSxS المجلد وليس في المسار. ما أعتقد أنك بحاجة إلى القيام به هو دمج معلومات البيان ل DLL ذات الصلة (الموجودة في %WINDIR%\WinSxS\Manifests) الدخول الى حسابك setup.py. وبعد أضفت القسم التالي:

<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.VC90.CRT"
            version="9.0.30729.4918"
            processorArchitecture="X86"
            publicKeyToken="1fc8b3b9a1e18e3b"
            language="*"
        />
    </dependentAssembly>
</dependency>

مباشرة بعد القائمة <dependency> القسم، وإعادة بناء EXE: ركض دون مشاكل. ملحوظة: اعتمادا على الإصدار تماما من ملفات Visual C ++ التي قمت بتثبيتها، قد لا تكون المعلومات المذكورة أعلاه صحيحة تماما. انظر إلى البيان على نظامك واستخدام الصحيح version, publicKeyToken إلخ.

بدلا من ذلك، انظر إلى هذه الإجابة لكيفية نشر DLLS مع تطبيقك (بدلا من افتراض وجودها بالفعل على النظام المستهدف). يا ... أرى أنك طلبت السؤال الأصلي ؛-)

نصائح أخرى

كان سؤالك: كيف يمكنني تصحيح PY2EXE

تفضل بقشيش:

بالنسبة لمشكلتك المحددة، أتوقع أن تجد حلا على هذا الموضوع أكثر اكتمالا يتعامل مع نفس المشكلة:

Fails Py2exe لتوليد قابل للتنفيذ

لقد استخدمت Py2exe من قبل ولم أهرب أبدا عبر موقف مثل هذا ....

ومع ذلك، فإنه يبدو أن التبعيات المفقودة هي مشكلتك .....

هل يعمل البرنامج المعبأ على جهازك ولكن ليس على الآخرين؟

إذا كان الأمر كذلك، فقم بتشغيل التطبيق المعبأ داخل (ومسات الاستبعاد) على كلا الجهازين ومقارنتها بملائذى الحزم التي لم يتم تضمينها.

حظ سعيد

ليس من المفترض أن نسخ جميع .dlls الذي يشكو منه! بعضها ملفات نظام Windows، وهي موجودة في الأماكن الصحيحة على النظام. إذا قمت بنسخها إلى مجلد Dist، فلن تعمل الأمور بشكل صحيح.

بشكل عام، أنت تريد فقط نسخ .dlls المحددة لتطبيقك. ليس النظام .dlls. في بعض الحالات، قد تحتاج إلى شحن vcredist_xx.exe في برنامج التثبيت الخاص بك للحصول على وقت تشغيل MSVC على النظام. يجب أن لا تحاول أبدا شحن ملفات .dlls "RAW" بنفسك. استخدم حزمة Redist، وسوف يوفر لك الوقت والإحباط.

هل حاولت اتباع الاتجاهات هنا: http://wiki.wxpython.org/smallapp. ?

هل أنت متأكد من أنك تعطي نفس DLLs الذي يستخدمه Wxpython.

يمكن تنزيل DLLs VC ++ المستخدمة من قبل Wxpython من صفحة تنزيل Wxpython. هل جربت هذه واحدة؟

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