Я все еще получаю ошибку рекурсии в python: переполнение стека ошибок памяти - PullRequest
0 голосов
/ 30 апреля 2020

Я и мои друзья работаем над проектом в 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)

1 Ответ

0 голосов
/ 02 мая 2020

У вас две проблемы:

  1. Вы неправильно вставили свой код в свой вопрос. Трассировка стека показывает, что ваша timeC функция является виновником, потому что она рекурсивно вызывает check, предположительно что-то вроде:
def timeC():
   time.sleep(10)
   check()
Вы пытаетесь выполнить бесконечное l oop с помощью рекурсии, что является плохим решением в Python, поскольку хвостовые вызовы не выталкивают стек; бесконечная рекурсия будет использовать память бесконечного стека. Вместо этого вы должны просто сделать l oop вне check. Избавьтесь от timeC и ваших вызовов и сделайте что-то вроде этого:
while True:
    check()
    sleep(10)

Внутри check, когда проверка завершена, return вместо выполнения рекурсивного вызова , Пусть внешний l oop позаботится о планировании следующей проверки.

...