Я не понимаю, почему с помощью Pool.request("GET", URL) в качестве ответа: должно вызывать любое исключение, учитывая, что нет синтаксических ошибок, указывающих на то, что управление контекстом не поддерживается.
Код: Выделить всё
from urllib3 import PoolManager
URL = "https://httpbin.org/anything"
def func1(): # this runs without error
with PoolManager() as pool:
response = pool.request("GET", URL)
print(response.json())
response.close()
def func2(): # this raises a ValueError exception
with PoolManager() as pool:
with pool.request("GET", URL) as response:
print(response.json())
if __name__ == "__main__":
for func in (func1, func2):
print("Executing", func.__name__)
func()
Код: Выделить всё
Executing func1
{'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'python-urllib3/2.5.0', 'X-Amzn-Trace-Id': 'Root=1-68ff3ea7-0cb79344009934e6782a6cb7'}, 'json': None, 'method': 'GET', 'origin': '999.999.999.999', 'url': 'https://httpbin.org/anything'}
Executing func2
Traceback (most recent call last):
File "/Users/me/Documents/Python/Oct27a.py", line 22, in
func()
~~~~^^
File "/Users/me/Documents/Python/Oct27a.py", line 15, in func2
with pool.request("GET", URL) as response:
~~~~~~~~~~~~^^^^^^^^^^^^
ValueError: I/O operation on closed file.
По предложению в комментариях я внес следующие изменения:
Код: Выделить всё
from urllib3 import PoolManager
URL = "https://httpbin.org/anything"
def func1(pool):
response = pool.request("GET", URL)
print(response.json())
response.close()
def func2(pool):
with pool.request("GET", URL) as response:
print(response.json())
if __name__ == "__main__":
with PoolManager() as pool:
for func in (func1, func2):
print("Executing", func.__name__)
func(pool)
Подробнее здесь: https://stackoverflow.com/questions/798 ... cted-error