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 -- [email protected]
To unsubscribe send an email to [email protected]