2011-08-25 88 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 –