我有一个 python 脚本,它与线程、进程和与数据库的连接一起工作。当我运行我的脚本时,python 崩溃了。
我无法明确检测到发生这种情况的情况。
现在我正在寻找在 python 崩溃时获取更多信息的工具,或者寻找查看我创建的所有进程/连接的查看器。
我创建了一个模块RemoteException.py,它显示了进程中异常的完整回溯。蟒蛇2。下载它并将其添加到您的代码中:
import RemoteException
@RemoteException.showError
def go():
raise Exception('Error!')
if __name__ == '__main__':
import multiprocessing
p = multiprocessing.Pool(processes = 1)
r = p.apply(go) # full traceback is shown here
旧答案
我也有这个问题。
这就是我所做的......一个远程异常来调试多处理调用
复制源代码并删除第 19 行:
file.write('\nin %s ' % (Process.thisProcess,))
和行
import Process
问题是:多处理只传输异常但丢失了回溯。下面的代码创建一个保存回溯的异常对象。并在调用过程中打印出来。
在您的脚本中,您可以执行以下操作:
import RemoteException
def f():
try:
# here is code that fails but you do know not where
pass
except:
ty, err, tb = RemoteException.exc_info() # like sys.exc_info but with better message
raise ty, err, tb
# here follows your multiprocessing call to f
pip install celery
然后在您的代码中:
from celery.contrib import rdb; rdb.set_trace()
这就像一个远程 pdb,如下所示:
Remote Debugger:6899: Ready to connect: telnet 127.0.0.1 6899
Type `exit` in session to continue.
Remote Debugger:6899: Waiting for client...
从另一个窗口 telnet localhost 6899 ,你有一个完整的功能 pdb 可用。
我不知道您的情况,但是如果您使用线程或多处理,那么您的代码(通常)适用于并行处理。在困难的情况下,我所做的一切只是调用没有池的函数,捕获错误,然后再次进入池。
有一个名为 WinPDB 的图形调试器,它使您可以选择遵循特定的 Python 进程。您可以单步执行并查看调用堆栈中不同位置的所有变量。
它为您提供了在 fork 中遵循哪个进程的选项。
它甚至会捕获最终异常并让您查看它的来源。