簡體   English   中英

我仍然在 python 中遇到遞歸錯誤:memory 錯誤堆棧溢出

[英]I'm still getting error of recursion in python: memory error stack overflow

我和我的朋友們正在 python 中開展一個項目。我們編寫了一些代碼,使他在列表中搜索的收件箱中發送的每封電子郵件,如果他在列表中找到,腳本在 web 站點上執行一些操作。 問題是當我們在一段時間后運行腳本時,我們得到堆棧的遞歸錯誤! 我們修改了以這種方式增加的代碼,添加sys.setrecursionlimit(sys.getrecursionlimit() + 100)但經過幾個小時腳本給出: Memory 錯誤!堆棧溢出

這是整個腳本代碼:


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)

你有兩個問題:

  1. 您沒有正確地將代碼粘貼到您的問題中。 堆棧跟蹤顯示您的timeC function 是罪魁禍首,因為它遞歸調用check ,大概是這樣的:
def timeC():
   time.sleep(10)
   check()
  1. 您正在嘗試通過遞歸進行無限循環,這在 Python 中是一個錯誤的決定,因為尾調用不會彈出堆棧; 無限遞歸將使用無限堆棧 memory。 相反,您應該在check之外執行一個簡單的循環。 擺脫timeC和您對它的調用,並執行以下操作:
while True:
    check()
    sleep(10)

check內部,當檢查完成時, return而不是進行遞歸調用。 讓外循環負責安排下一次檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM