Dvorapa created this task.
Dvorapa added a project: Pywikibot.
Restricted Application added subscribers: pywikibot-bugs-list, Aklapper.

TASK DESCRIPTION
  **Steps to reproduce**
  
    import pywikibot
    s=pywikibot.Site('test2', 'wikipedia')
    for i in s.allpages(namespace=14, filterredir=False):  # iterate over all 
categories
      if not i.isEmptyCategory() and next(i.categories(total=1), False):  # is 
a subcategory and contains 1 or more subcategories
        c = i.subcategories(recurse=True)  # get subcategories
        if i in c:  # is there a loop?
          g = set()
          for j in c:  # iterate over members
            if g:
              g.add(j)  # add loop member
            if j == i:  # found beginning/end of the loop
              if not g:
                g.add(i)  # start tracking the loop
              else:
                print(g)  # finish loop
                break
  
  **Expected behavior**
  This simple code to print category loops worked for years, last time in May 
2022 
<https://cs.wikipedia.org/w/index.php?title=Wikipedie:%C3%9Adr%C5%BEbov%C3%A9_seznamy/Cykly_v_kategori%C3%ADch/seznam&action=history>.
  
  **Current behavior**
  Lately the code started to fail after a minute of running with this long 
traceback:
  
    $ python cykly-v-kategoriich2.py
    ERROR: Traceback (most recent call last):
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 681, 
in _http_request
        response = http.request(self.site, uri=uri,
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 233, in request
        r = fetch(baseuri, headers=headers, **kwargs)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 399, in fetch
        callback(response)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 284, in 
error_handling_callback
        raise response from None
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 390, in fetch
        response = session.request(method, uri,
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 587, 
in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 701, 
in send
        r = adapter.send(request, **kwargs)
      File "/usr/lib/python3.10/site-packages/requests/adapters.py", line 489, 
in send
        resp = conn.urlopen(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
703, in urlopen
        httplib_response = self._make_request(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
449, in _make_request
        six.raise_from(e, None)
      File "<string>", line 3, in raise_from
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
444, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.10/http/client.py", line 1374, in getresponse
        response.begin()
      File "/usr/lib/python3.10/http/client.py", line 337, in begin
        self.headers = self.msg = parse_headers(self.fp)
      File "/usr/lib/python3.10/http/client.py", line 236, in parse_headers
        return email.parser.Parser(_class=_class).parsestr(hstring)
      File "/usr/lib/python3.10/email/parser.py", line 67, in parsestr
        return self.parse(StringIO(text), headersonly=headersonly)
      File "/usr/lib/python3.10/email/parser.py", line 56, in parse
        feedparser.feed(data)
      File "/usr/lib/python3.10/email/feedparser.py", line 176, in feed
        self._call_parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 180, in _call_parse
        self._parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 295, in _parsegen
        if self._cur.get_content_maintype() == 'message':
      File "/usr/lib/python3.10/email/message.py", line 594, in 
get_content_maintype
        ctype = self.get_content_type()
      File "/usr/lib/python3.10/email/message.py", line 578, in get_content_type
        value = self.get('content-type', missing)
      File "/usr/lib/python3.10/email/message.py", line 471, in get
        return self.policy.header_fetch_parse(k, v)
      File "/usr/lib/python3.10/email/_policybase.py", line 316, in 
header_fetch_parse
        return self._sanitize_header(name, value)
      File "/usr/lib/python3.10/email/_policybase.py", line 287, in 
_sanitize_header
        if _has_surrogates(value):
      File "/usr/lib/python3.10/email/utils.py", line 57, in _has_surrogates
        s.encode()
    RecursionError: maximum recursion depth exceeded while calling a Python 
object
    
    WARNING: Waiting 5.0 seconds before retrying.
    ERROR: Traceback (most recent call last):
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 681, 
in _http_request
        response = http.request(self.site, uri=uri,
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 233, in request
        r = fetch(baseuri, headers=headers, **kwargs)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 399, in fetch
        callback(response)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 284, in 
error_handling_callback
        raise response from None
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 390, in fetch
        response = session.request(method, uri,
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 587, 
in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 701, 
in send
        r = adapter.send(request, **kwargs)
      File "/usr/lib/python3.10/site-packages/requests/adapters.py", line 489, 
in send
        resp = conn.urlopen(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
703, in urlopen
        httplib_response = self._make_request(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
449, in _make_request
        six.raise_from(e, None)
      File "<string>", line 3, in raise_from
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
444, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.10/http/client.py", line 1374, in getresponse
        response.begin()
      File "/usr/lib/python3.10/http/client.py", line 337, in begin
        self.headers = self.msg = parse_headers(self.fp)
      File "/usr/lib/python3.10/http/client.py", line 236, in parse_headers
        return email.parser.Parser(_class=_class).parsestr(hstring)
      File "/usr/lib/python3.10/email/parser.py", line 67, in parsestr
        return self.parse(StringIO(text), headersonly=headersonly)
      File "/usr/lib/python3.10/email/parser.py", line 56, in parse
        feedparser.feed(data)
      File "/usr/lib/python3.10/email/feedparser.py", line 176, in feed
        self._call_parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 180, in _call_parse
        self._parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 295, in _parsegen
        if self._cur.get_content_maintype() == 'message':
      File "/usr/lib/python3.10/email/message.py", line 594, in 
get_content_maintype
        ctype = self.get_content_type()
      File "/usr/lib/python3.10/email/message.py", line 578, in get_content_type
        value = self.get('content-type', missing)
      File "/usr/lib/python3.10/email/message.py", line 471, in get
        return self.policy.header_fetch_parse(k, v)
      File "/usr/lib/python3.10/email/_policybase.py", line 316, in 
header_fetch_parse
        return self._sanitize_header(name, value)
      File "/usr/lib/python3.10/email/_policybase.py", line 287, in 
_sanitize_header
        if _has_surrogates(value):
      File "/usr/lib/python3.10/email/utils.py", line 57, in _has_surrogates
        s.encode()
    RecursionError: maximum recursion depth exceeded while calling a Python 
object
    
    WARNING: Waiting 10.0 seconds before retrying.
    ERROR: Traceback (most recent call last):
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 681, 
in _http_request
        response = http.request(self.site, uri=uri,
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 233, in request
        r = fetch(baseuri, headers=headers, **kwargs)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 399, in fetch
        callback(response)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 284, in 
error_handling_callback
        raise response from None
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 390, in fetch
        response = session.request(method, uri,
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 587, 
in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 701, 
in send
        r = adapter.send(request, **kwargs)
      File "/usr/lib/python3.10/site-packages/requests/adapters.py", line 489, 
in send
        resp = conn.urlopen(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
703, in urlopen
        httplib_response = self._make_request(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
449, in _make_request
        six.raise_from(e, None)
      File "<string>", line 3, in raise_from
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
444, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.10/http/client.py", line 1374, in getresponse
        response.begin()
      File "/usr/lib/python3.10/http/client.py", line 337, in begin
        self.headers = self.msg = parse_headers(self.fp)
      File "/usr/lib/python3.10/http/client.py", line 236, in parse_headers
        return email.parser.Parser(_class=_class).parsestr(hstring)
      File "/usr/lib/python3.10/email/parser.py", line 67, in parsestr
        return self.parse(StringIO(text), headersonly=headersonly)
      File "/usr/lib/python3.10/email/parser.py", line 56, in parse
        feedparser.feed(data)
      File "/usr/lib/python3.10/email/feedparser.py", line 176, in feed
        self._call_parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 180, in _call_parse
        self._parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 295, in _parsegen
        if self._cur.get_content_maintype() == 'message':
      File "/usr/lib/python3.10/email/message.py", line 594, in 
get_content_maintype
        ctype = self.get_content_type()
      File "/usr/lib/python3.10/email/message.py", line 578, in get_content_type
        value = self.get('content-type', missing)
      File "/usr/lib/python3.10/email/message.py", line 471, in get
        return self.policy.header_fetch_parse(k, v)
      File "/usr/lib/python3.10/email/_policybase.py", line 316, in 
header_fetch_parse
        return self._sanitize_header(name, value)
      File "/usr/lib/python3.10/email/_policybase.py", line 287, in 
_sanitize_header
        if _has_surrogates(value):
      File "/usr/lib/python3.10/email/utils.py", line 57, in _has_surrogates
        s.encode()
    RecursionError: maximum recursion depth exceeded while calling a Python 
object
    
    WARNING: Waiting 20.0 seconds before retrying.
    ERROR: Traceback (most recent call last):
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 681, 
in _http_request
        response = http.request(self.site, uri=uri,
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 233, in request
        r = fetch(baseuri, headers=headers, **kwargs)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 399, in fetch
        callback(response)
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 284, in 
error_handling_callback
        raise response from None
      File "/home/pavel/pywikibot/pywikibot/comms/http.py", line 390, in fetch
        response = session.request(method, uri,
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 587, 
in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 701, 
in send
        r = adapter.send(request, **kwargs)
      File "/usr/lib/python3.10/site-packages/requests/adapters.py", line 489, 
in send
        resp = conn.urlopen(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
703, in urlopen
        httplib_response = self._make_request(
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
449, in _make_request
        six.raise_from(e, None)
      File "<string>", line 3, in raise_from
      File "/usr/lib/python3.10/site-packages/urllib3/connectionpool.py", line 
444, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.10/http/client.py", line 1374, in getresponse
        response.begin()
      File "/usr/lib/python3.10/http/client.py", line 337, in begin
        self.headers = self.msg = parse_headers(self.fp)
      File "/usr/lib/python3.10/http/client.py", line 236, in parse_headers
        return email.parser.Parser(_class=_class).parsestr(hstring)
      File "/usr/lib/python3.10/email/parser.py", line 67, in parsestr
        return self.parse(StringIO(text), headersonly=headersonly)
      File "/usr/lib/python3.10/email/parser.py", line 56, in parse
        feedparser.feed(data)
      File "/usr/lib/python3.10/email/feedparser.py", line 176, in feed
        self._call_parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 180, in _call_parse
        self._parse()
      File "/usr/lib/python3.10/email/feedparser.py", line 295, in _parsegen
        if self._cur.get_content_maintype() == 'message':
      File "/usr/lib/python3.10/email/message.py", line 594, in 
get_content_maintype
        ctype = self.get_content_type()
      File "/usr/lib/python3.10/email/message.py", line 578, in get_content_type
        value = self.get('content-type', missing)
      File "/usr/lib/python3.10/email/message.py", line 471, in get
        return self.policy.header_fetch_parse(k, v)
      File "/usr/lib/python3.10/email/_policybase.py", line 316, in 
header_fetch_parse
        return self._sanitize_header(name, value)
      File "/usr/lib/python3.10/email/_policybase.py", line 287, in 
_sanitize_header
        if _has_surrogates(value):
      File "/usr/lib/python3.10/email/utils.py", line 57, in _has_surrogates
        s.encode()
    RecursionError: maximum recursion depth exceeded while calling a Python 
object
    
    WARNING: Waiting 40.0 seconds before retrying.
    --- Logging error ---
    Traceback (most recent call last):
      File "/usr/lib/python3.10/logging/handlers.py", line 75, in emit
        logging.FileHandler.emit(self, record)
      File "/usr/lib/python3.10/logging/__init__.py", line 1218, in emit
        StreamHandler.emit(self, record)
      File "/usr/lib/python3.10/logging/__init__.py", line 1100, in emit
        msg = self.format(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 943, in format
        return fmt.format(record)
      File "/home/pavel/pywikibot/pywikibot/tools/_logging.py", line 36, in 
format
        return super().format(record).rstrip()
      File "/usr/lib/python3.10/logging/__init__.py", line 681, in format
        s = self.formatMessage(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 650, in formatMessage
        return self._style.format(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 440, in format
        return self._format(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 436, in _format
        return self._fmt % values
    RecursionError: maximum recursion depth exceeded while getting the str of 
an object
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/pavel/pywikibot/cykly-v-kategoriich2.py", line 34, in <module>
        for j in c:
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 100, in 
subcategories
        yield from self.members(member_type='subcat', recurse=recurse,
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 197, in 
members
        for member in subcat.members(
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 197, in 
members
        for member in subcat.members(
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 197, in 
members
        for member in subcat.members(
      [Previous line repeated 964 more times]
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 196, in 
members
        for subcat in self.subcategories():
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 100, in 
subcategories
        yield from self.members(member_type='subcat', recurse=recurse,
      File "/home/pavel/pywikibot/pywikibot/page/_category.py", line 183, in 
members
        for member in self.site.categorymembers(self, total=total, **kwargs):
      File "/usr/lib/python3.10/_collections_abc.py", line 330, in __next__
        return self.send(None)
      File "/home/pavel/pywikibot/pywikibot/tools/collections.py", line 275, in 
send
        return next(self._started_gen)
      File "/home/pavel/pywikibot/pywikibot/data/api/_generators.py", line 610, 
in generator
        self.data = self.request.submit()
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 965, 
in submit
        response, use_get = self._http_request(use_get, uri, body, headers,
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 705, 
in _http_request
        self.wait()
      File "/home/pavel/pywikibot/pywikibot/data/api/_requests.py", line 1110, 
in wait
        pywikibot.sleep(delay)
      File "/home/pavel/pywikibot/pywikibot/__init__.py", line 1164, in sleep
        stopme()
      File "/home/pavel/pywikibot/pywikibot/__init__.py", line 1177, in stopme
        _flush(False)
      File "/home/pavel/pywikibot/pywikibot/__init__.py", line 1237, in _flush
        log('Dropped throttle(s).')
      File "/home/pavel/pywikibot/pywikibot/tools/_deprecate.py", line 399, in 
wrapper
        return obj(*__args, **__kw)
      File "/home/pavel/pywikibot/pywikibot/logging.py", line 255, in log
        logoutput(msg, *args, level=VERBOSE, **kwargs)
      File "/home/pavel/pywikibot/pywikibot/tools/_deprecate.py", line 399, in 
wrapper
        return obj(*__args, **__kw)
      File "/home/pavel/pywikibot/pywikibot/logging.py", line 152, in logoutput
        logger.log(level, msg, extra=context, **kwargs)
      File "/usr/lib/python3.10/logging/__init__.py", line 1547, in log
        self._log(level, msg, args, **kwargs)
      File "/usr/lib/python3.10/logging/__init__.py", line 1624, in _log
        self.handle(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 1634, in handle
        self.callHandlers(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 1696, in callHandlers
        hdlr.handle(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 968, in handle
        self.emit(record)
      File "/usr/lib/python3.10/logging/handlers.py", line 77, in emit
        self.handleError(record)
      File "/usr/lib/python3.10/logging/__init__.py", line 1022, in handleError
        traceback.print_exception(t, v, tb, None, sys.stderr)
      File "/usr/lib/python3.10/traceback.py", line 119, in print_exception
        te = TracebackException(type(value), value, tb, limit=limit, 
compact=True)
      File "/usr/lib/python3.10/traceback.py", line 502, in __init__
        self.stack = StackSummary.extract(
      File "/usr/lib/python3.10/traceback.py", line 383, in extract
        f.line
      File "/usr/lib/python3.10/traceback.py", line 306, in line
        self._line = linecache.getline(self.filename, self.lineno)
      File "/usr/lib/python3.10/linecache.py", line 30, in getline
        lines = getlines(filename, module_globals)
      File "/usr/lib/python3.10/linecache.py", line 42, in getlines
        if len(entry) != 1:
    RecursionError: maximum recursion depth exceeded while calling a Python 
object
    CRITICAL: Exiting due to uncaught exception <class 'RecursionError'>
  
  **Configuration**
  Tested both on Python 3.7.3 and 3.10.8, both my computer (Arch Linux) and 
Toolforge (Debian Linux)

TASK DETAIL
  https://phabricator.wikimedia.org/T323413

EMAIL PREFERENCES
  https://phabricator.wikimedia.org/settings/panel/emailpreferences/

To: Dvorapa
Cc: Xqt, Aklapper, pywikibot-bugs-list, Dvorapa, PotsdamLamb, Jyoo1011, 
JohnsonLee01, SHEKH, Dijkstra, Khutuck, Zkhalido, Viztor, Wenyi, Tbscho, MayS, 
Mdupont, JJMC89, Altostratus, Avicennasis, mys_721tx, jayvdb, Masti, Alchimista
_______________________________________________
pywikibot-bugs mailing list -- pywikibot-bugs@lists.wikimedia.org
To unsubscribe send an email to pywikibot-bugs-le...@lists.wikimedia.org

Reply via email to