2014年,我编写了一个PyQt4应用程序,该应用程序内部使用了一个非PyQt模块,并且应有的工作近两年。现在,非PyQt模块已经在PyQt应用程序中按预期停止了工作(我有qt4和qt5端口,这两个共享问题)。下面是一个示例代码来说明发生了什么:

#! /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


最初,我从PyQt应用程序中调用mymodule的方法,它返回了嵌套列表,现在返回了None。我试图找到任何解释或澄清,为什么观察到的行为已更改但未更改。

我已经隔离了负责将mymodule行为呈现给调用QApplication([sys.argv])的代码,并且想知道是否有人知道发生了什么。最让我感到困扰的是,该模块在应用程序启动之前就可以正常运行,但此后不再可用。

有关mymodule的更多详细信息:
它是用mymodule.c编写并通过python setup.py install调用安装的C库的包装。

感谢您的任何提前评论!

[编辑]有关mymodule的更多信息:

mymodule.c代码段

#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;
}

最佳答案

我通过不使用anaconda作为我的python软件包管理器解决了该问题。通过将所有内容安装到系统中,它又可以正常工作。但是问题仍然存在,因为它为什么不能在anaconda中运行(但是已经运行了这么长时间)仍然超出了我的范围。

我已经发布了这个答案,但是如果有人对现象进行了解释,我将不接受它。如果过了一段时间没有其他答复,我会将其标记为接受,以使问题池更加整洁。

谢谢大家的时间和建议。

关于python - QApplication启动后,非PyQt模块停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40466172/

10-12 22:00