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;
}
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. –
Ja, tut es. Es hat 2 Jahre lang ohne Probleme funktioniert – LynxLike
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. –