2016-11-07 6 views
2

Im Jahr 2014 habe ich eine PyQt4-App geschrieben, die ein PyQt-Modul innerhalb verwendet und es funktionierte, wie es sollte für fast zwei Jahre. Nun hat das Nicht-PyQt-Modul nicht mehr wie erwartet in der PyQt-Anwendung funktioniert (ich habe qt4- und qt5-Ports, beide teilen das Problem). Im Folgenden ein Beispielcode zu veranschaulichen, was los ist:Nicht-PyQt-Modul funktioniert nicht mehr nach QApplication start

#! /usr/bin/env python3 
import sys, getopt 
from PyQt5.QtWidgets import QApplication # or PyQt4 

# non PyQt module: 
import mymodule 

# demo of the mymodule use. It returns nested list 
# with info about objects saved in fname 

fname = "/my/file/name" 
res0 = mymodule.getnames(fname) 
# res0 = [[...],...,[...]] the way it should 
# 
app = QApplication(sys.argv) 
... 
# with or without actual run of the application via 
# app.exec_() 
... 
res2 = mymodule.getnames(fname) 
# this time the result is: 
# res2 = None 

Ursprünglich nannte ich die Methode von mymodule aus PyQt App und die verschachtelten Liste zurückgegeben, jetzt ist es keine gibt. Ich habe versucht, irgendeine Erklärung oder Klärung zu finden, warum sich das beobachtete Verhalten geändert hat, aber es versäumt hat.

Ich habe den Code für das Rendern des Modumodule-Verhaltens auf den Aufruf QApplication([sys.argv]) isoliert und fragte mich, ob jemand eine Idee hat, was los ist. Was mich am meisten nervt ist, dass das Modul vor dem Start der Anwendung funktioniert, danach aber nicht mehr.

Einige weitere Details über mymodule: es ist ein Wrapper einer C-Bibliothek geschrieben in mymodule.c und installiert über die python setup.py install Aufruf.

Vielen Dank für alle Kommentare im Voraus!

[Bearbeiten] Weitere Informationen über mymodule:

mymodule.c Code-Schnipsel

#include <Python.h> 
#include <extlib.h> 
#include <math.h> 

... 
static PyObject * mymodule_getnames(PyObject *self, PyObject *args) 
{ 
char *filename; 

if (!PyArg_ParseTuple(args, "s", &filename)) 
    return NULL; 
FILE *fp = extlib_func(filename); 
... 
PyObject *names = PyList_New(0); 
... 
PyList_Append(names, Py_BuildValue("s", title)); 
... 
return names; 
} 

... 

int main(int argc, char *argv[]) 
{ 
Py_SetProgramName(
#if PY_MAJOR_VERSION >= 3 
       (wchar_t *) 
#endif 
       argv[0]); 
Py_Initialize(); 
return 0; 
} 
+1

Haben Sie verifiziert, dass 'mymodule.getnames' mit zwei aufeinander folgenden Aufrufen funktioniert, noch bevor die Anwendung gestartet wird? Würde wahrscheinlich helfen, wenn Sie den Code der Funktion auch einfügen könnten. –

+0

Ja, tut es. Es hat 2 Jahre lang ohne Probleme funktioniert – LynxLike

+0

es sollte entweder 'QApplication (sys.argv)' oder 'QApplication ([one_arg, another_arg])' sein. Übergeben Sie keine Liste der Zeichenfolgen an QApplication, nur eine Liste von Zeichenfolgen. –

Antwort

1

ich das Problem gelöst haben, indem nicht anaconda als mein Python-Paket-Manager. Indem alles im System installiert wurde, funktionierte es wieder so wie es sollte. Aber die Frage bleibt, seit der Grund, warum es nicht innerhalb der Anakonda arbeitet (aber für so lange Zeit), immer noch über mir ist.

Ich habe diese Antwort gepostet, werde sie aber nicht akzeptieren, wenn jemand mit einer Erklärung der Phänomene kommt. Wenn es nach einiger Zeit keine andere Antwort geben wird, werde ich es als akzeptiert markieren, um den Fragenpool zu leeren.

Vielen Dank für Ihre Zeit und Anregungen.

+0

Obwohl dies eine Problemumgehung ist, beantwortet es nicht die ursprüngliche Frage, warum es aufgehört hat zu arbeiten, es kann durchaus nichts mit Anaconda selbst zu tun haben (eher wurde etwas wie eine Abhängigkeit von einem anderen Paket installiert). Daher empfehle ich, es nicht zuzulassen . Eine Sache, die Sie wahrscheinlich versuchen sollten, ist Anaconda zu deinstallieren und neu zu installieren (wenn möglich die gleiche Version, die Sie beim letzten Mal verwendet haben) und Ihr Paket. – Schollii

+0

Hallo! Danke für die Vorschläge. Ich denke, das Problem ist wirklich auf der Modulseite. Meistens hat der folgende Hinweis in der Dokumentation mich gewarnt, den Fehler zu lokalisieren: Hinweis: Entfernen von Einträgen aus sys.modules oder Importieren kompilierter Module in mehrere Interpreter innerhalb eines Prozesses (oder nach einem fork() ohne eine intervenierende exec()) kann erstellen Probleme für einige Erweiterungsmodule. Autoren von Extension-Modulen sollten bei der Initialisierung interner Datenstrukturen Vorsicht walten lassen. Wird meine Antwort bearbeiten, wenn ich die Moduländerungen für weitere Referenz testen, falls erforderlich. – LynxLike

+0

Klingt gut Ich freue mich darauf – Schollii

Verwandte Themen