2014-02-14 11 views
5

Ich habe einen Benutzer einer eingefrorenen wxpython-App, die den angehängten Screenshot erhält."Windows Fehler: Provider-DLL konnte nicht korrekt initialisiert werden" beim Import von cgi-Modul in gefrorene wxpython-App

Die Fehlermeldung lautet „Windows Fehler: Provider-DLL korrekt konnte nicht initialisiert werden“

Ein Screenshot von einer Pause Video genommen der einzige Weg ist, die ich von ihnen diese Fehlermeldung bekommen konnte, weil das Ganze sofort verschwindet (einschließlich Dieses DOS-Fenster erstellt, um stderr zu erfassen, wo diese Nachricht angezeigt wird). IE Python stirbt, bevor es überhaupt richtig losgeht.

Die Zurückverfolgungspunkte auf meinen Code an controller.py Leitung 14

Diese Linie ist

import cgi

Aus irgendeinem Grund, dass cgi scheint beim Import zufällig ruft (warum würde das sei?) und aus irgendeinem Grund scheitert dies aus irgendeinem Grund der DLL.

Irgendwelche Hinweise?

Hinweis 1: Diese App funktioniert gut für Hunderte von anderen Windows- und Mac-Benutzer. Es ist also so, als würde ich aus irgendeinem Grund nicht etwas liefern, das nicht nur auf dem Computer dieses Benutzers liegt.

Anmerkung 2: die ausführbare Datei wird mit bbfreeze erstellt mit folgenden Konfiguration:

f = Freezer(distdir = distdir, 
      includes = ['wx.lib.pubsub.core.kwargs.*', 
         'wx.lib.pubsub.core.*', 
         'dbhash', 
         'platform'] 
      ) 

Ich bin nicht sicher, was sonst würde ich hier setzen. "CGI"? 'zufällig'?

Screenshot

Antwort

1

Dies scheint irgendwo in os.urandom auftreten und wahrscheinlich durch einige fehlende oder falsche Umgebungsvariablen verursacht wird. Insbesondere passiert es, wenn die Umgebung zu lang ist.

  • Wenn Sie Python von einer Shell starten, öffnen Sie eine neue Shell und versuchen Sie es erneut. Wenn das Problem weiterhin besteht, prüfen Sie, ob ungewöhnlich viele Umgebungsvariablen vorhanden sind.
  • Wenn Sie Python von einem anderen Prozess aus starten, überprüfen Sie, ob die Prozessumgebung ordnungsgemäß eingerichtet ist. Ich habe festgestellt, dass dies bei Prozessen, die von Apaches CGI-Modul ausgeführt werden, oft nicht der Fall ist.
  • Wenn Sie Python als CGI-Prozess starten, sollten Sie bessere Alternativen wie mod_wsgi in Erwägung ziehen.

    +0

    Neustart half mir nicht. –

    5

    Für mich ist die genaue Fehlermeldung lautet:

    WindowsError: [Fehler -2146893795] Provider DLL ist fehlgeschlagen korrekt mit einer Spur wie

    initialisieren:

    File "C:\Dev\Python\python-2.7.11\lib\tempfile.py", line 35, in <module> 
        from random import Random as _Random 
        File "C:\Dev\Python\python-2.7.11\lib\random.py", line 885, in <module> 
        _inst = Random() 
        File "C:\Dev\Python\python-2.7.11\lib\random.py", line 97, in __init__ 
        self.seed(x) 
        File "C:\Dev\Python\python-2.7.11\lib\random.py", line 113, in seed 
        a = long(_hexlify(_urandom(2500)), 16) 
    WindowsError: [Error -2146893795] Provider DLL failed to initialize correctly 
    

    Und was gelöst es war für mich ein Kommentar von http://bugs.python.org/issue1384175 (http://bugs.python.org/msg248947), mit den folgenden Worten:

    This happened at a call to `os.urandom` for me. 
    This was in a subprocess. 
    
    The bug for me was that I called `_subprocess.CreateProcess` 
    with an `env_mapper = {'foo': 'bar'}`. The fix: 
    
        env_mapper = os.environ.copy() 
        env_mapper.update({'foo': 'bar'}) 
    
    +0

    Ich habe Sie fast uprobiert (ich habe die exakt gleiche Fehlermeldung), aber ich verstehe den zweiten Teil Ihrer Antwort nicht. – user568021

    +0

    Wenn Sie einen Unterprozess erstellen, müssen Sie die aktuelle Betriebssystemumgebungsumgebung kopieren und als Parameter an den Unterprozess übergeben. –

    1

    Ich denke, die minimale Lösung besteht darin, die Umgebungsvariable SYSTEMROOT in den Python-Subprozess aufzunehmen.

    Ich habe das Problem gesehen, wenn sie versuchen os.urandom zu laden:

    self._authkey = AuthenticationString(os.urandom(32)) WindowsError: [Error -2146893795] Provider DLL failed to initialize correctly

    Es stellt sich heraus, dass die _PyOS_URandom unter Windows auf dem Set SYSTEMROOT Umgebung werden beruht. Siehe: http://bugs.python.org/issue1384175#msg248951 für eine detaillierte Erklärung

    +1

    Das ist ein guter Fund. Ich denke, es ist eine erstaunlich unbekümmerte Haltung zu sagen: "Ich glaube nicht, dass Python dich davon abhalten sollte, sich in den Fuß zu schießen", wenn es so eine dunkle Abhängigkeit ist! – GreenAsJade