python - 我仍然在python中遇到递归错误:内存错误堆栈溢出
问题描述
我和我的朋友们正在用 python 做一个项目。我们编写一些代码,让他在一个列表中搜索的收件箱中发送的每封电子邮件,如果他在列表中找到,脚本在网站上执行一些操作。问题是,当我们在一段时间后运行脚本时,会出现堆栈递归错误!我们修改了以这种方式增加的代码,sys.setrecursionlimit(sys.getrecursionlimit() + 100)
但在几个小时后脚本给出:内存错误!堆栈溢出!
这是整个脚本代码:
import zmail
import time
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
server = zmail.server('EMAIL', 'PASSWORD')
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)
sheet = client.open("SHEET LIST").sheet1
#sheet.update_cell(1, 6, "Error!")
def check():
sair = False
mailbox_info = server.stat()
sys.setrecursionlimit(sys.getrecursionlimit() + 100)
if mailbox_info[0] > 0:
total = mailbox_info[0]
for x in range(0, total):
#print(x)
body = server.get_mail(total - x)
body = body['content_text']
body = str(body)
print(body)
row = len(sheet.col_values(1))
emails = sheet.col_values(1)
passwords = sheet.col_values(2)
keys = sheet.col_values(4)
contador = 0
while sair == False:
#print(row)
#print(contador)
if body.find(str(emails[contador])) != -1:
#print("if")
f = open("log.txt", "a")
email = str(emails[contador])
passw = str(passwords[contador])
key = str(keys[contador])
print("Found this email " + email)
f.write("Found this email " + email + "\n")
driver = webdriver.Chrome(options=options)
try:
driver.get("WEBSITE FOR DOING ACTION")
except:
sheet.update_cell(contador + 1, 6, "Error!")
sair = True
email_in = driver.find_element_by_xpath("/html/body/div/div[2]/div/div[3]/input")
email_in.send_keys(email)
print("Writing email...")
f.write("Writing email... \n")
password_in = driver.find_element_by_xpath("/html/body/div/div[2]/div/div[4]/input")
password_in.send_keys(passw)
print("Writing password...")
f.write("Writing password... \n")
key_in = driver.find_element_by_xpath("/html/body/div/div[2]/div/div[6]/input")
key_in.send_keys(key)
print("Writing key...")
f.write("Writing key... \n")
checkbox_in = driver.find_element_by_xpath("/html/body/div/div[2]/div/div[2]/label[2]/input")
driver.execute_script("arguments[0].click();", checkbox_in)
print("Selecting checkbox...")
f.write("Selecting checkbox... \n")
button_in = driver.find_element_by_xpath("/html/body/div/div[2]/div/div[8]")
print("Clicking button...")
f.write("Clicking button... \n")
driver.execute_script("arguments[0].click();", button_in)
time.sleep(120)
if driver.find_element_by_xpath("/html/body/div/div[2]/div/div[1]/p[2]").is_displayed():
sheet.update_cell(contador + 1, 6, "Success!")
else:
sheet.update_cell(contador + 1, 6, "Error!")
driver.close()
contador += 1
if contador >= row:
sair = True
#sair = True
else:
#print("else")
contador += 1
if contador >= row:
sair = True
contador = 0
timeC()
else:
timeC()
def timeC():
time.sleep(10) ```
但我知道错误出在这部分代码中
timeC()
else:
timeC()
def timeC():
time.sleep(10)
check()
timeC()
我们如何解决伙计?
这是在检查之外具有递归限制的回溯:
File "main.py", line 100, in timeC
check()
File "main.py", line 95, in check
timeC()
File "main.py", line 100, in timeC
check()
File "main.py", line 95, in check
timeC()
File "main.py", line 100, in timeC
check()
File "main.py", line 95, in check
timeC()
File "main.py", line 100, in timeC
check()
File "main.py", line 95, in check
timeC()
File "main.py", line 100, in timeC
check()
File "main.py", line 95, in check
timeC()
File "main.py", line 100, in timeC
check()
File "main.py", line 95, in check
timeC()
File "main.py", line 100, in timeC
check()
File "main.py", line 25, in check
mailbox_info = server.stat()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\site-packages\zmail\server.py", line 129, in stat
with self.pop_server as server:
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\site-packages\zmail\abc.py", line 78, in __enter__
self.login()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\site-packages\zmail\server.py", line 306, in login
self._make_server()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\site-packages\zmail\server.py", line 290, in _make_server
self.server = poplib.POP3_SSL(self.host, self.port, timeout=self.timeout)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\poplib.py", line 447, in __init__
POP3.__init__(self, host, port, timeout)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\poplib.py", line 102, in __init__
self.sock = self._create_socket(timeout)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\poplib.py", line 450, in _create_socket
sock = POP3._create_socket(self, timeout)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\poplib.py", line 108, in _create_socket
return socket.create_connection((self.host, self.port), timeout)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\socket.py", line 707, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\socket.py", line 748, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
RecursionError: encoding with 'idna' codec failed (RecursionError: maximum recursion depth exceeded in comparison)
解决方案
你有两个问题:
- 您没有正确地将代码粘贴到您的问题中。堆栈跟踪显示您的
timeC
函数是罪魁祸首,因为它递归调用check
,大概是这样的:
def timeC():
time.sleep(10)
check()
- 您正在尝试通过递归进行无限循环,这在 Python 中是一个错误的决定,因为尾调用不会弹出堆栈;无限递归将使用无限堆栈内存。相反,您应该只在
check
. 摆脱timeC
您对它的调用,并执行以下操作:
while True:
check()
sleep(10)
在内部check
,当检查完成时,return
而不是进行递归调用。让外循环负责安排下一次检查。
推荐阅读
- php - Laravel 查询生成器 (5.6)
- excel - 计算每天的细胞总数
- php - 已安装 Mongodb 驱动程序,但未显示在 php 模块中。
- php - array_combine 具有相同的键名
- excel - OR 代替 AND 用于 SUMIFS
- javascript - 创建一个Button来刷新其他文件而不打开
- node.js - 错误:模块没有自注册。(对于 onoff 包需要)
- ruby - 在 Ruby 中记录确切的异常来源及其在 at_exit 的回溯
- javascript - 表中的动态父/子
- python - 使用 MNIST 数据集进行迁移学习的代码中的“文件名”是什么?