Ipython: 'Exception non gérée dans la boucle d'événement' (WinError 995)

Créé le 16 déc. 2019  ·  43Commentaires  ·  Source: ipython/ipython

J'ai commencé à utiliser ipython récemment. Maintenant, je reçois souvent ce message en faisant n'importe quelle action, même les plus simples comme définir des variables :

Unhandled exception in event loop:
  File "c:\users\USER\appdata\local\programs\python\python38-32\lib\asyncio\proactor_events.py", line 768, in _loop_self_reading
    f.result()  # may raise
  File "c:\users\USER\appdata\local\programs\python\python38-32\lib\asyncio\windows_events.py", line 808, in _poll
    value = callback(transferred, key, ov)
  File "c:\users\USER\appdata\local\programs\python\python38-32\lib\asyncio\windows_events.py", line 457, in finish_recv
    raise ConnectionResetError(*exc.args)

Exception [WinError 995] The I/O operation has been aborted because of either a thread exit or an application request
Press ENTER to continue...

Ce message apparaît parfois, parfois non, pour la même commande (comme xyz = "hello"). Je n'ai aucune idée de ce que j'ai fait de mal. L'interprète normal n'a pas ce problème. En utilisant 3.8 et installé ipython 7.10.2 via le cmd.

Merci.

Commentaire le plus utile

Après quelques recherches, je pense qu'il s'agit d'un bogue dans l'implémentation de l'asyncio de Python sur la plate-forme Windows :

Python 3.8.1 (tags/v3.8.1:1b293b6, 18 décembre 2019, 23:11:46) [MSC v.1916 64 bits (AMD64)] sur Windows 10 Version 1809 (OS Build 17763.1039)

1) Ajouter au fichierLibasyncioproactor_events.py dans la fonction BaseProactorEventLoop._loop_self_reading après la ligne 768 le code suivant :

766....try:
767........if f is not None:
768............f.result() # may raise
...........if self._stopping:
...............raise exceptions.CancelledError("Event loop is stopping")
769........f = self._proactor.recv(self._ssock, 4096)

2) Testez. Je n'ai plus d'erreurs...

EDIT : vous pouvez simplement utiliser if self._stopping: return à la place dans ce contexte de code particulier (devrait être un peu plus rapide)

EDIT2 : Bug sur bugs.python.org et description de la cause de cette erreur (trouvé par quelqu'un d'autre) : https://bugs.python.org/issue39010#msg362076

Tous les 43 commentaires

Pouvez-vous essayer de rétrograder prompt toolkit vers 2.x pour voir si c'est la cause ?

J'ai rétrogradé vers la boîte à outils rapide 2.0.10 et cela a fonctionné. Merci beaucoup.
Pourriez-vous s'il vous plaît dire, comme je suis complètement nouveau dans ce domaine, qu'est-ce qui a changé ?
Et pourrais-je avoir des problèmes à cause de l'inversion de la version ?

Prompt_toolkit 3 (la bibliothèque qui permet à IPython d'avoir une édition multiligne et une coloration syntaxique) a été publiée juste avant IPython 7.10 ; il essaie de jouer mieux avec asyncio eventloop si vous faites de la programmation simultanée. Nous avons fait de notre mieux pour rendre IPython compatible avec le prompt toolkit 3, mais il y a quelques cas extrêmes auxquels nous n'avons peut-être pas pensé.

Tout devrait bien fonctionner avec prompt_toolkit 2.x, et nous essaierons de comprendre pourquoi vous avez l'erreur ci-dessus.

Avec votre erreur actuelle, il est difficile de savoir exactement d'où cela vient, mais j'espère que dans les prochaines versions, nous en préciserons la raison.

Une idée quand cela va être résolu?

Lorsque quelqu'un trouve le temps de rechercher pourquoi cela se produit et quelle est la solution ; potentiellement quelqu'un avec une machine Windows comme VM est particulièrement lent.

Malheureusement, tous les mainteneurs réguliers (c'est-à-dire surtout moi) le font pendant leur temps libre - ce qui est rare. Je n'ai pas non plus de machine windows.

Si vous trouvez des indices, des séquences d'actions qui déclenchent toujours cela cela aiderait.

Après quelques recherches, je pense qu'il s'agit d'un bogue dans l'implémentation de l'asyncio de Python sur la plate-forme Windows :

Python 3.8.1 (tags/v3.8.1:1b293b6, 18 décembre 2019, 23:11:46) [MSC v.1916 64 bits (AMD64)] sur Windows 10 Version 1809 (OS Build 17763.1039)

1) Ajouter au fichierLibasyncioproactor_events.py dans la fonction BaseProactorEventLoop._loop_self_reading après la ligne 768 le code suivant :

766....try:
767........if f is not None:
768............f.result() # may raise
...........if self._stopping:
...............raise exceptions.CancelledError("Event loop is stopping")
769........f = self._proactor.recv(self._ssock, 4096)

2) Testez. Je n'ai plus d'erreurs...

EDIT : vous pouvez simplement utiliser if self._stopping: return à la place dans ce contexte de code particulier (devrait être un peu plus rapide)

EDIT2 : Bug sur bugs.python.org et description de la cause de cette erreur (trouvé par quelqu'un d'autre) : https://bugs.python.org/issue39010#msg362076

MrEightFive Merci pour votre solution. Cela semble fonctionner pour moi

@MrEightFive Merci, je viens d'implémenter le changement. Il semble fonctionner très bien.

@MrEightFive On dirait que cela fonctionne également pour Python 3.8.2.

Merci @MrEightFive et @Carreau pour vos solutions, très appréciées, j'ai eu le même problème.

@MrEightFive On dirait que cela fonctionne également pour Python 3.8.2.

Même expérience positive

Idem, merci !

Rencontrer cela aussi. @MrEightFive si vous pensez connaître le correctif, soumettez peut-être une demande d'extraction à CPython ? :clin d'œil:

@segevfiner
Je ne suis pas membre du groupe de développement CPython, et selon leur document, il y a un processus de vérification (extensif) avant qu'ils ne vous laissent entrer. Cela ne vaut pas la peine pour moi de passer par une seule demande d'extraction, même si je l'aurais fait si c'était plus facile.

Deuxièmement, le rapport de bogue pour cela existe déjà sur bugs.python.org (voir EDIT2 dans mon post ci-dessus), sous un titre différent, mais la raison de ce bogue est indiquée exactement comme je l'ai découvert. Donc je suppose qu'il n'est pas nécessaire de dupliquer.

Troisièmement, bien que ma solution de contournement fonctionne, je n'ai aucune garantie qu'elle n'ait pas d'effets secondaires (elle a certaines dépendances quant à la façon dont l'arrêt de la boucle d'événements est implémenté dans cette version particulière d'asyncio, et cela pourrait changer). J'ai exécuté les tests asyncio de CPython (sur 3.8.1), et ils avaient réussi, mais je n'ai jamais étudié au-delà de cela. Il est préférable que quelqu'un travaillant réellement sur asyncio et connaissant bien le code CPython le vérifie.

@MrEightFive C'est en fait plus simple que vous ne le pensez. Soumettez simplement un PR et signez un CLA, puis attendez la révision du code, etc. Comme tout autre projet dans GitHub. Bien que CPython ne semble souvent pas avoir suffisamment de personnes examinant les demandes d'extraction, beaucoup sont laissées en suspens. Alternativement, vous pouvez simplement publier votre solution de contournement suggérée sur le problème de suivi des bogues Python. Même si vous n'êtes pas sûr, vous pouvez simplement le dire dans le PR/numéro, en faisant part de vos inquiétudes à ce sujet. Cela permet souvent à quelqu'un de plus familier d'examiner le problème et de vérifier le correctif ou d'en proposer un meilleur/correct. Mais ce n'est qu'une suggestion, ne le faites que si vous en avez vraiment envie.

cette erreur s'est produite également lors de l'utilisation de promt_toolkit, mais la solution : MrEightyFive fonctionne à merveille, a fait gagner beaucoup de temps, merci

ajouter du code à proactor_events.py (comme suggéré par MrEightFive) n'a pas aidé mais pip install --upgrade prompt-toolkit==2.0.10 l'a fait. Win10 Python38.

La solution de KyryloKaralyus a fonctionné pour moi. Une chose à noter - j'ai d'abord accidentellement exécuté (manquant le 0 à la fin) pip install --upgrade prompt-toolkit==2.0.1 et cela a provoqué l'apparition de l'erreur sans arrêt. J'ai dû tuer le terminal.

ajouter du code à proactor_events.py (comme suggéré par MrEightFive) n'a pas aidé mais pip install --upgrade prompt-toolkit==2.0.10 l'a fait. Win10 Python38.

Cela a fonctionné pour moi.

La pull request a finalement été proposée pour CPython : bpo-39010 : Ignorer l'erreur sur le futur annulé après la fin de la boucle.

BTW, il est TRÈS difficile de modifier proactor_events.py si python a été installé à partir de MS Store.

图片

J'ai changé le propriétaire pour moi et mis moi et "tout le monde" au contrôle total. Mais je ne peux toujours pas modifier le fichier, même en mode sans échec et "réessayer en tant qu'administrateur".

J'ai rétrogradé vers la boîte à outils rapide 2.0.10 et cela a fonctionné. Merci beaucoup.

pip install prompt-toolkit==2.0.10

Je reçois cette exception avec python 3.8.3, ipython 7.13.0, prompt_toolkit 3.0.5

BTW, il est TRÈS difficile de modifier proactor_events.py si python a été installé à partir de MS Store.

Le moyen le plus simple consiste à copier l'intégralité du package asyncio dans votre projet et à le modifier, puis à vous fier à Python pour masquer l'intégralité du module. Les applications du Windows Store sont _très_ bien protégées.

Mais je suis aussi le suivi du patch CPython.

Après quelques recherches, je pense qu'il s'agit d'un bogue dans l'implémentation de l'asyncio de Python sur la plate-forme Windows :

Python 3.8.1 (tags/v3.8.1:1b293b6, 18 décembre 2019, 23:11:46) [MSC v.1916 64 bits (AMD64)] sur Windows 10 Version 1809 (OS Build 17763.1039)

  1. Ajouter au fichierLibasyncioproactor_events.py dans la fonction BaseProactorEventLoop._loop_self_reading après la ligne 768 le code suivant :

766....try:
767........if f is not None:
768............f.result() # may raise
...........if self._stopping:
...............raise exceptions.CancelledError("Event loop is stopping")
769........f = self._proactor.recv(self._ssock, 4096)

  1. Test. Je n'ai plus d'erreurs...

EDIT : vous pouvez simplement utiliser if self._stopping: return à la place dans ce contexte de code particulier (devrait être un peu plus rapide)

EDIT2 : Bug sur bugs.python.org et description de la cause de cette erreur (trouvé par quelqu'un d'autre) : https://bugs.python.org/issue39010#msg362076

a fonctionné pour moi aussi !!
Merci!!

J'ai rétrogradé vers la boîte à outils rapide 2.0.10 et cela a fonctionné. Merci beaucoup.

pip install prompt-toolkit==2.0.10

Merci beaucoup, cela a fonctionné pour moi:

conda install prompt_toolkit=2.0.10

Pouvez-vous essayer de rétrograder la boîte à outils d'invite vers 2.x pour voir si c'est la cause

Cela m'a aussi aidé, merci !

pip install --upgrade prompt-toolkit==2.0.10

Merci beaucoup, j'ai enfin la solution ci-dessus qui fonctionne sur mon appareil !!

J'ai essayé de faire ce qui suit mais j'obtiendrais toujours [Errno 13] Autorisation refusée

  1. Ajouter au fichierLibasyncioproactor_events.py dans la fonction BaseProactorEventLoop._loop_self_reading après la ligne 768 le code suivant :

Cela a été corrigé dans 3.9rc2

@imba-tjd Sera-t-il rétroporté vers les anciennes versions de Python ? (Ou l'a-t-il déjà ?)

à partir des bogues python, il semble qu'il ait été rétroporté sur 3.8.

Je reçois l'erreur même avec 3.9rc2...

Pouvez-vous essayer de rétrograder la boîte à outils d'invite vers 2.x pour voir si c'est la cause?

Cela a aidé, merci.

Je me demande si cela est maintenant corrigé dans Python 3.8.6 et 3.9.

Après quelques recherches, je pense qu'il s'agit d'un bogue dans l'implémentation de l'asyncio de Python sur la plate-forme Windows :

Python 3.8.1 (tags/v3.8.1:1b293b6, 18 décembre 2019, 23:11:46) [MSC v.1916 64 bits (AMD64)] sur Windows 10 Version 1809 (OS Build 17763.1039)

  1. Ajouter au fichierLibasyncioproactor_events.py dans la fonction BaseProactorEventLoop._loop_self_reading après la ligne 768 le code suivant :

766....try:
767........if f is not None:
768............f.result() # may raise
...........if self._stopping:
...............raise exceptions.CancelledError("Event loop is stopping")
769........f = self._proactor.recv(self._ssock, 4096)

  1. Test. Je n'ai plus d'erreurs...

EDIT : vous pouvez simplement utiliser if self._stopping: return à la place dans ce contexte de code particulier (devrait être un peu plus rapide)

EDIT2 : Bug sur bugs.python.org et description de la cause de cette erreur (trouvé par quelqu'un d'autre) : https://bugs.python.org/issue39010#msg362076

J'ai eu ce problème avec une nouvelle installation de Python 3.8.3 en utilisant Anaconda sur Windows 10 et la solution de contournement de @MrEightFive a parfaitement fonctionné pour moi !

pip install --upgrade prompt-toolkit==2.0.10
Cela a fonctionné pour moi sur la version Windows Anaconda3-2020.11.

Cela a (presque) fonctionné pour moi sur Windows 10, Anaconda Individual Edition 2020.11 .

Si vous êtes un autre utilisateur d'Anaconda, vous souhaiterez peut-être conserver cette mise à jour dans l'environnement conda :
conda install -c conda-forge prompt_toolkit

Ce qui a fonctionné pour moi.

Il apparaît instantanément après l'exécution d'un try-except-block , dans d'autres cas, il est imprévisible

Je veux juste ajouter le texte d'erreur en allemand, afin qu'il soit trouvé par plus d'utilisateurs. (Windows 10 Professionnel, Version 2004)

Exception non gérée dans la boucle d'événements :
Fichier "c:usersuserappdatalocalprogramspythonpython38libasyncioproactor_events.py", ligne 768, dans _loop_self_reading
f.result() # peut augmenter
Fichier "c:usersuserappdatalocalprogramspythonpython38libasynciowindows_events.py", ligne 808, dans _poll
valeur = rappel (transféré, clé, ov)
Fichier "c:usersuserappdatalocalprogramspythonpython38libasynciowindows_events.py", ligne 457, dans finish_recv
lever ConnectionResetError(*exc.args)

Exception [WinError 995] Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen
Appuyez sur ENTRÉE pour continuer...

Tristement

conda install -c conda-forge prompt_toolkit

n'a pas résolu le problème pour moi.

@musm , vous devez spécifier prompt_toolkit v2.

conda install -c conda-forge prompt_toolkit=2

Je suis sur Anaconda 2020.11 en train de faire

conda install -c conda-forge prompt_toolkit=2

Conduit à des conflits massifs :

> conda install -c conda-forge prompt_toolkit=2
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: \
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.
Examining qtpy:   1%|▌                                                                 | 3/327 [00:00<00:20, 16.00it/s]\Examining statsmodels:   1%|▌                                                          | 3/327 [00:00<00:20, 16.00it/s]/Examining ipython_genutils:   3%|█▌                                                   | 10/327 [00:07<04:17,  1.23it/s]|Examining pyflakes:   5%|██▉                                                          | 16/327 [00:10<02:19,  2.22it/s]|Examining zope.event:   7%|████▏                                                      | 23/327 [00:13<02:18,  2.20it/s]\Examining vs2015_runtime:  11%|██████                                                 | 36/327 [00:17<02:29,  1.94it/s]\Examining mpir:  15%|█████████▌                                                       | 48/327 [01:32<37:15,  8.01s/it]\Examining krb5:  17%|███████████▎                                                     | 57/327 [01:38<06:35,  1.47s/it]-Examining prometheus_client:  18%|█████████▌                                          | 60/327 [01:42<09:06,  2.05s/it]|Examining cython:  19%|████████████▏                                                  | 63/327 [01:47<08:58,  2.04s/it]-Examining flake8:  21%|█████████████                                                  | 68/327 [02:37<24:45,  5.73s/it]-Examining pytest:  25%|███████████████▊                                               | 82/327 [03:30<30:07,  7.38s/it]-Examining openpyxl:  26%|███████████████▊                                             | 85/327 [03:51<25:16,  6.27s/it]\Examining beautifulsoup4:  32%|█████████████████▎                                    | 105/327 [04:08<03:40,  1.01it/s]|Examining html5lib:  35%|████████████████████▉                                       | 114/327 [04:11<01:34,  2.25it/s]/Examining console_shortcut:  35%|██████████████████▏                                 | 114/327 [04:11<01:34,  2.25it/s]-Examining qt:  37%|████████████████████████▌                                         | 122/327 [04:14<01:09,  2.94it/s]/Examining wheel:  38%|████████████████████████                                       | 125/327 [04:14<00:54,  3.71it/s]|Examining greenlet:  39%|███████████████████████▍                                    | 128/327 [04:18<03:24,  1.03s/it]\Examining bokeh:  40%|█████████████████████████                                      | 130/327 [04:19<02:27,  1.33it/s]|Examining bleach:  40%|████████████████████████▊                                     | 131/327 [04:37<19:29,  5.97s/it]|Examining entrypoints:  40%|███████████████████████                                  | 132/327 [04:39<15:25,  4.75s/it]|Examining et_xmlfile:  40%|███████████████████████▍                                  | 132/327 [04:39<15:25,  4.75s/it]/Examining rtree:  42%|██████████████████████████▏                                    | 136/327 [04:39<07:31,  2.37s/it]-Examining backcall:  42%|████████████████████████▉                                   | 136/327 [04:39<07:31,  2.37s/it]\Examining libssh2:  45%|███████████████████████████▌                                 | 148/327 [04:58<06:13,  2.09s/it]\Examining path:  52%|█████████████████████████████████▍                              | 171/327 [05:54<23:54,  9.19s/it]/Examining pywavelets:  53%|██████████████████████████████▌                           | 172/327 [05:55<16:51,  6.53s/it]-Examining importlib_metadata:  54%|███████████████████████████▏                      | 178/327 [06:06<07:34,  3.05s/it]-Examining prompt_toolkit=2:  55%|████████████████████████████▍                       | 179/327 [06:07<07:56,  3.22s/it]-Examining seaborn:  56%|██████████████████████████████████▏                          | 183/327 [06:17<06:30,  2.71s/it]\Examining jupyterlab_widgets:  57%|████████████████████████████▎                     | 185/327 [06:21<05:57,  2.52s/it]|Examining jdcal:  58%|████████████████████████████████████▍                          | 189/327 [06:21<02:55,  1.27s/it]-Examining widgetsnbextension:  59%|█████████████████████████████▌                    | 193/327 [06:22<01:18,  1.70it/s]-Examining multipledispatch:  64%|█████████████████████████████████▍                  | 210/327 [07:07<03:36,  1.85s/it]-Examining yaml:  68%|███████████████████████████████████████████▍                    | 222/327 [07:19<01:11,  1.46it/s]-Examining libxslt:  70%|██████████████████████████████████████████▌                  | 228/327 [07:31<03:34,  2.17s/it]\Examining python-jsonrpc-server:  70%|████████████████████████████████▉              | 229/327 [07:31<02:30,  1.54s/it]|Examining typed-ast:  71%|█████████████████████████████████████████▊                 | 232/327 [07:32<01:01,  1.54it/s]\Examining @/win-64::__archspec==1=x86_64:  71%|██████████████████████████▉           | 232/327 [07:32<01:01,  1.54it/s]|Examining urllib3:  73%|████████████████████████████████████████████▍                | 238/327 [07:42<03:30,  2.36s/it]/Examining backports:  73%|███████████████████████████████████████████                | 239/327 [07:47<04:20,  2.96s/it]\Examining mccabe:  76%|███████████████████████████████████████████████▏          

Salut @musm , c'est l'un des inconvénients de l'utilisation de la distribution complète d'Anaconda. Il y a tellement de modules qu'il peut être difficile de résoudre toutes leurs dépendances simultanément si vous vous écartez de la distribution fournie. Vous pouvez essayer Miniconda à la place, qui est Conda, mais sans les modules préinstallés. Avec lui, vous créez des environnements pour inclure uniquement les modules dont vous avez besoin pour votre projet.

Je n'ai pas essayé cela, mais il est possible que vous puissiez également le faire sans avoir à désinstaller Anaconda et à installer Miniconda à la place. IE Créez un nouvel environnement à partir de rien qui ne comprend que des modules spécifiques. Essayez-le avec une commande comme celle-ci (modifiez les noms des modules pour inclure ce dont vous avez vraiment besoin).

conda create -n <myenv> python ipython prompt_toolkit=2 jupyter pandas numpy scipy scikit-learn matplotlib
Cette page vous a été utile?
0 / 5 - 0 notes