Юпитер, Асинсио и Слэк - PullRequest
0 голосов
/ 10 мая 2019

Я сталкиваюсь с известной проблемой запуска асинхронных функций в Jupyter (https://github.com/jupyterlab/jupyterlab/issues/4399, https://github.com/ipython/ipython/issues/11030 и ссылкой в ​​https://blog.jupyter.org/ipython-7-0-async-repl-a35ce050f7f7).

Я просто обновляю библиотеку Slack Pythonдо версии 2.0, и я столкнулся с той же проблемой, что и выше, а именно:

import slack

client = slack.WebClient(token=os.environ["SLACK_TOKEN"])
client.chat_postMessage(channel="@flavien", text="test")

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-12-20f89b3af945> in <module>
      2 
      3 client = slack.WebClient(token=os.environ["SLACK_TOKEN"])
----> 4 asyncio.run(client.chat_postMessage(channel="@flavien", text="test"))

~/miniconda3/envs/analytics/lib/python3.6/site-packages/slack/web/client.py in chat_postMessage(self, channel, **kwargs)
    289         """
    290         kwargs.update({"channel": channel})
--> 291         return self.api_call("chat.postMessage", json=kwargs)
    292 
    293     def chat_unfurl(

~/miniconda3/envs/analytics/lib/python3.6/site-packages/slack/web/base_client.py in api_call(self, api_method, http_verb, files, data, params, json)
    133             return future
    134 
--> 135         return self._event_loop.run_until_complete(future)
    136 
    137     def _validate_xoxp_token(self):

~/miniconda3/envs/analytics/lib/python3.6/site-packages/nest_asyncio.py in run_until_complete(self, future)
     61             return f.result()
     62         else:
---> 63             return self._run_until_complete_orig(future)
     64 
     65     bogus_handle = asyncio.Handle(None, None, loop)

~/miniconda3/envs/analytics/lib/python3.6/asyncio/base_events.py in run_until_complete(self, future)
    453         future.add_done_callback(_run_until_complete_cb)
    454         try:
--> 455             self.run_forever()
    456         except:
    457             if new_task and future.done() and not future.cancelled():

~/miniconda3/envs/analytics/lib/python3.6/asyncio/base_events.py in run_forever(self)
    410         if events._get_running_loop() is not None:
    411             raise RuntimeError(
--> 412                 'Cannot run the event loop while another loop is running')
    413         self._set_coroutine_wrapper(self._debug)
    414         self._thread_id = threading.get_ident()

RuntimeError: Cannot run the event loop while another loop is running

Несмотря на множество испытаний, мне не удалось заставить его работать. Есть ли способ обойти эту проблему?

Версии моих пакетов с Python 3.6.6

jupyter                   1.0.0                      py_2    conda-forge
ipykernel                 5.1.0         py36h24bf2e0_1002    conda-forge
tornado                   6.0.2            py36h516909a_0    conda-forge
slackclient               2.0.1                    pypi_0    pypi

Заранее благодарен за помощь.

1 Ответ

0 голосов
/ 17 мая 2019

Проблема, по моему мнению, заключается в том, что вы запускаете кусок кода внутри вашей jupyter ячейки или ipython. Попробуйте запустить его как отдельный код Python и дайте мне знать, если вы видите ту же ошибку.

Причина, по которой вы видите эту ошибку, заключается в том, что jupyter уже запускает цикл для вашей ячейки, которая управляет ядром внутри.

...