Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入模块死锁(使用Py_new解释器)_Python_Python 3.x - Fatal编程技术网

Python 导入模块死锁(使用Py_new解释器)

Python 导入模块死锁(使用Py_new解释器),python,python-3.x,Python,Python 3.x,我正在编写一个具有嵌入式Python解释器的应用程序,但也可以从应用程序中运行脚本文件 我想要归档的是有一种方法来重置解释器,或者它可以在不影响全局环境的情况下执行文件/语句,这样您就可以运行脚本、编辑文件并再次运行脚本,而无需在其间完成python(或者重置我的解释器) 我试图创建一个新的解释器,但有时它会挂起整个应用程序(死锁)。这里有一个小的演示来看看这个问题 Py_Initialize(); PyThreadState* pGlobalThreadState = PyThreadStat

我正在编写一个具有嵌入式Python解释器的应用程序,但也可以从应用程序中运行脚本文件

我想要归档的是有一种方法来重置解释器,或者它可以在不影响全局环境的情况下执行文件/语句,这样您就可以运行脚本、编辑文件并再次运行脚本,而无需在其间完成python(或者重置我的解释器)

我试图创建一个新的解释器,但有时它会挂起整个应用程序(死锁)。这里有一个小的演示来看看这个问题

Py_Initialize();
PyThreadState* pGlobalThreadState = PyThreadState_Get();
PyThreadState* pInterpreterThreadState = Py_NewInterpreter();
PyThreadState_Swap(pInterpreterThreadState);

PyRun_SimpleString("import PySide"); // Importing PySide deadlocks

Py_EndInterpreter(pInterpreterThreadState);
PyThreadState_Swap(pGlobalThreadState);
如果我保存GIL声明,它有时会工作,但根据文档,Py_NewInterpreter不支持它

使用Python 3.4


是否有其他解决方案可以在单独的环境中运行命令或修复死锁?

使用多个解释器与调用
PyGILstate\u sure
的扩展不兼容,例如PySide(检查回溯)。它在
PyEval_RestoreThread
中处于死锁状态,调用它是因为保存在线程本地存储中的线程状态与当前线程状态不匹配。您可以解决这个问题,但仍然存在一个问题,即
PyGILstate\u确保
只对新线程使用单个
autoexplorerstate
。看到问题了,看到了!对于这样的问题,可能的解决方案是什么?或者有没有更好的解决方案来创建一个“干净”的环境来执行,这样用户就不必卸载模块或重新启动应用程序了?我调用了
PyEval\u SaveThread
,然后在一个名为
PyEval\u RestoreThread
的新线程中。在这个新线程中,调用Py_NewInterpreter将新线程状态存储到线程本地存储(TLS)。现在,当PySide调用
PyGILstate\u确保当前线程状态与保存在TLS中的线程状态匹配,并且不会死锁。但这并不能解决真正的问题。当PySide创建一个新线程调用Python时,
PyGILstate\u确保
只使用主解释器。在相关问题中,有一些想法可以加强这一点。目前它只是不受支持。的3.4源链接。感谢提供信息!!如果我只使用主解释器和保存/恢复状态,有什么好方法吗?比如“保存状态、执行脚本、恢复环境状态(已加载的模块、全局等)”,也许我可以像这样保存字典和恢复模块: