Python程序在命令行窗口中停止运行

12

我搜索了很多关于VMware和Python的问题,但是我没有找到任何与我的问题相关的信息。

我的问题是Python程序会冻结,进程仍在运行,但它不使用CPU,内存使用量也不改变。

程序没有返回任何异常或其他内容……它只是冻结了,永远无法恢复执行。

看起来这种情况发生得很随机,并且并不是我的机器上没有可用的内存问题,因为在同一时间里我可以在另一个会话中执行它。

我的机器是虚拟机,运行的系统是:Windows Server 2008 64位,VMware工具版本为9.4.5。

我尝试过Python版本有:2.7、3.3和3.4。

以下是一个示例脚本(但不仅限于此脚本会冻结):

print("START")
for i in range(0, 1000): 
  print("step: " + str(i)) 
  file = open("./test_file.csv", "r") #file size is 1.2GB but I have 10GB RAM
  for line in file.readlines(): 
    pass    
  file.close() #close the file
print("END")

示例输出为:

START
step 0
step 1
step 2
step 3
step 4

程序会突然冻结,而且不确定是在哪一步(有时候是第4步、第15步、第34步...)。我唯一能做的就是结束进程并重新运行程序。 在执行过程中,我可以看到程序会反复使用1.2GB内存并释放...使用和释放。冻结总是发生在释放内存之后,从此之后内存使用量稳定,此进程的CPU使用率为0%。

我在IDLE中运行脚本以使用调试器和堆栈查看器,但当程序冻结时,整个 IDLE 不再响应。 我还尝试了在其他非虚拟机上运行,没有出现问题。

我会很感激任何关于如何解决或调试这种问题的建议。


你提到你有10GB的RAM,但是...你是指主机有10GB的物理内存,还是你已经为虚拟机分配了10GB的内存?看起来你的虚拟机确实缺乏内存。 - evadeflow
这里有同样的解决方案- https://serverfault.com/questions/204150/sometimes-powershell-stops-sending-output-until-i-press-enter-why - rdmolony
2个回答

27

我解决了问题,问题不是出在 Python 或 VMware 上...只是我的微软产品知识不够。

我没有提到我是在 Windows 命令行中执行 Python 脚本,导致“卡顿”的原因是 cmd。 我不知道如果在命令行窗口中选取一些内容,cmd 会暂停执行的任务。

只有在这个虚拟机上我设置了“快速编辑模式”,你可以按以下步骤更改:右键单击 cmd 面板 -> 属性 -> 选项选项卡 ->“快速编辑模式”部分)

在此模式下,如果您单击命令行,它将选择一些内容并暂停正在执行的任务... 我关闭了“快速编辑模式”,程序运行得非常完美。 没有“快速编辑模式”,您无法通过单击来选择任何命令行中的内容。

我知道...我应该感到羞愧...而我也确实如此。


4
哦,天哪,谢谢!我花了很多时间尝试找出脚本或解释器中的问题。早些时候应该用谷歌搜索...问题完全一样。Python会在任何地方突然卡住,没有任何迹象,只有在命令提示符中按下任何键后才继续执行。 - Serge Norin
1
天啊!我在运行uvicorn web服务器时遇到了完全相同的问题。有时它会冻结,服务器无法接受请求。每个请求都以超时结束,而Web服务器或运行它的程序没有任何日志。禁用QuickEditMode解决了这个问题。谢谢! - hpeev
1
你不应该自责,微软应该……这是cmd的糟糕设计。你节省了我的时间/生命,我本来要经历一次痛苦的搜索才能找到冻结的真正原因,但是你发现了这种“功能”,它给用户带来了意外的问题。 - Károly Szabó

0

你可能应该使用 readline() 而不是 readlines(),后者会读取整个文件。


我使用了readlines(),因为它将整个文件加载到内存中,我可以看到内存中正在发生的事情;-) 当我将其更改为readline()和迭代范围后,它在1,100步后也会冻结;-) - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接