2011-08-25 60 views
2

我有一个到目前为止工作得很好的python脚本。但是,我的程序没有正确退出。我可以调试,直到我回到最后,但程序继续运行。 main.main()做了很多工作:它从数据提供者下载(http,ftp,sftp,...)一些csv文件,将数据转换成标准化的文件格式,并将所有的数据加载到数据库中。程序不会退出。如何找出python在做什么?

这工作正常。但是,该程序不会退出。我怎样才能知道程序在哪里“等待”? 存在着不止一个供应商 - 脚本正确终止所有供应商除了一个(SFTP下载,我使用的paramiko)

if __name__ == "__main__": 

    main.log = main.log2both 
    filestoconvert = [] 
    #filestoconvert = glob.glob(r'C:\Data\Feed\ProviderName\download\*.csv') 
    main.main(['ProviderName'], ['download', 'convert', 'load'], filestoconvert) 

我很高兴的任何想法和意见!

+0

您可以简单地添加一个信号,经过一段时间后,将退出脚本。如果它在两分钟内无法到达提供者,它将运行'sys.exit(1)'并将其记录在某处,但不会像现在那样挂断。如果你想让我写一个例子,我可以给出一个完整的答案。 – Gandi

+0

好吧,这听起来很合理,谢谢。但我仍然想知道发生了什么。定时sys.exit将是一个“解决方法”,如果我不知道是什么导致这种行为。 – andrew

回答

1

您可以使用sys.settrace来查明哪些功能块。然后你可以使用pdb来逐步完成它。

4

找到PDB命令如果你的程序不终止它很可能意味着你有一个线程仍在工作。

要列出所有正在运行的线程可以使用:

threading.enumerate() 

此功能可以列出当前正在运行的所有线程(见documentation

如果这还不够,你可能需要一些脚本与函数一起(见documentation):

sys._current_frames() 

所以打印所有活着的线程,你会做类似的堆栈跟踪:

import sys, traceback, threading 
thread_names = {t.ident: t.name for t in threading.enumerate()} 
for thread_id, frame in sys._current_frames().iteritems(): 
    print("Thread %s:" % thread_names.get(thread_id, thread_id)) 
    traceback.print_stack(frame) 
    print() 

祝你好运!

2

你最好使用GDB,它允许查明挂起的进程,像jstack在Java中

+0

这对Python不会很有用,你最终会陷入Python解释器的实现细节中。 –

+0

这实际上适用于gdb python扩展。尝试使用“py-bt”作为回溯或“线程应用所有py-bt”。另请参阅https://wiki.python.org/moin/DebuggingWithGdb –