gpt4 book ai didi

Python 程序意外终止

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:57 25 4
gpt4 key购买 nike

我有一个程序,可以抓取网站并在找到它时下载文件。通常它运行得很好,但有时它会在完成搜索序列之前终止程序的操作。我很困惑。仅在搜索时下载时它永远不会退出。我目前猜测是套接字错误问题,但正如我上面所说,我被难住了。我已经进行了 httperror 检查,并且没有显示任何 http 错误代码。我现在正在尝试插入套接字错误检查,它变得更加疯狂。在添加任何用于套接字错误检查的内容之前,它工作正常。一旦我添加套接字错误检查,程序就不会运行。它会调出 IDLE 显示并显示光标,就像 IDLE 已准备好并等待下一个命令一样。否则,如果没有套接字错误检查,则表明程序正在运行,直到 tkinter 窗口关闭(err 程序意外终止)。如果 tkinter 窗口关闭,它不会在 IDLE 上给出任何错误。

我必须做什么才能找出这个程序有时提前终止的原因,并能够将其捕获,这样它就不会终止,然后返回并再次重新运行相同的网址。我想我已经重新运行相同的网址,但我没有正确的套接字错误处理,如果它甚至是套接字错误问题的话。我被难住了。

#!/usr/bin/python3.4

import urllib.request
import os
from tkinter import *
import time
import urllib.error
import errno

root = Tk()
root.title("photodownloader")
root.geometry("200x200")

app = Frame(root)
app.grid()

os.chdir('/home/someone/somewhere/')
Fileupdate = 10000
Filecount = 19999
while Fileupdate <= Filecount:
try:
root.title(Fileupdate)
url = 'http://www.webpage.com/photos/'+str(Fileupdate)+'.jpg'
a = urllib.request.urlopen(url)
urllib.request.urlretrieve(url, str(Fileupdate)+'.jpg')
except urllib.error.HTTPError as err:
if err.code == 404:
Fileupdate = Fileupdate + 1
root.update_idletasks()
continue
else:
print(err.code)
Fileupdate = Fileupdate + 1
root.update_idletasks()
continue
except socket.error, v:
print(Fileupdate, v[0])
continue

Fileupdate = Fileupdate+1
root.update_idletasks()

最佳答案

我认为问题是由 tkinter 没有机会启动它的主事件循环引起的,这是在您调用 root.mainloop() 时完成的,我建议将您当前的代码放在 while 中循环而不是使用 root.after() 定期调用的函数方法。我已经包含了一个潜在的更改来测试这是否可以解决问题。

请注意以下几行:

                    Fileupdate = Fileupdate + 1
root.update_idletasks()
continue

在某些 except 分支中是多余的,因为如果代码继续运行就会发生这种情况,因此修改代码以在函数中工作的一部分就是简单地删除这些部分。这是我希望您尝试从原始 while 开始运行的代码声明:

#-while Fileupdate <= Filecount:
def UPDATE_SOCKET():
global Fileupdate #allow the global variable to be changed
if Fileupdate <= Filecount:
#/+
try:
root.title(Fileupdate)
url = 'http://www.webpage.com/photos/'+str(Fileupdate)+'.jpg'
a = urllib.request.urlopen(url)
urllib.request.urlretrieve(url, str(Fileupdate)+'.jpg')
except urllib.error.HTTPError as err:
#<large redundant section removed>
print("error code",err.code)
except socket.error as v:
print("socket error",Fileupdate, v[0])
#- continue
root.after(500, UPDATE_SOCKET)
return
#/+


Fileupdate = Fileupdate+1
#- root.update_idletasks()
root.after(100, UPDATE_SOCKET) #after 100 milliseconds call the function again
#change 100 to a smaller time to call this more frequently.


root.after(0,UPDATE_SOCKET) #when it has a chance, call the update for first time

root.mainloop() #enter main event loop
#/+

我用 #- 指示更改的行后面是替换它的 block ,以 #/+ 结尾。

关于Python 程序意外终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com