我有一个python脚本,到目前为止工作正常。但是,我的程序没有正确退出。我可以调试,直到我回到最后,但程序一直在运行。
main.main()做了很多事情:它从数据提供者下载(http,ftp,sftp,...)一些csv文件,将数据转换为标准化文件格式并将每个文件加载到数据库中。
这很好用。但是,该程序不会退出。如何找出程序在哪里“等待”? 存在多个提供程序 - 该脚本正确终止所有提供程序,除了一个(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 :(得分:6)
如果您的程序没有终止,则很可能意味着您的线程仍在运行。
列出您可以使用的所有正在运行的线程:
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()
祝你好运!
答案 1 :(得分:2)
你最好使用GDB,它可以查明挂起的进程,比如Java中的jstack
答案 2 :(得分:1)
您可以使用sys.settrace
查明哪些功能块。然后,您可以使用pdb
逐步完成它。
答案 3 :(得分:1)
您可以使用带有
的script.py的python调试器python -m pdb script.py
您可以在http://docs.python.org/library/pdb.html#debugger-commands
找到pdb命令答案 4 :(得分:0)
这个问题已经有 10 年的历史了,但我为遇到类似问题的人发布了我的解决方案,使用的是像我这样的非完成 Python 脚本。
就我而言,调试过程没有帮助。所有调试输出只显示一个线程。但是@JC Plessis 提出的应该进行一些工作的建议帮助我找到了原因。
我将 Selenium 与 chrome 驱动程序一起使用,在关闭唯一打开的选项卡后,我正在完成 selenium 过程
driver.close()
但是后来改代码使用无头浏览器,在driver.close()
之后Selenium驱动没有关闭,python脚本无限卡死。结果,关闭 Selenium 驱动程序的正确方法实际上是。
driver.quit()
问题解决了,脚本终于又完成了。