:=
表达式首先去 Unofficial Windows Binaries for Python Extension Packages 下载需要的 whl 包手动安装 (因为如果本地没有这些包的编译工具,pip 安装过程中会报错)
将以下包下载到本地之后:
cmd 到文件下载目录之后执行以下命令手动安装:
pip install pywin32‑225‑cp38‑cp38‑win_amd64.whl pyzmq‑18.1.0‑cp38‑cp38‑win_amd64.whl pywinpty‑0.5.5‑cp38‑cp38‑win_amd64.whl
pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com jupyter PyQt5
将 D:\Python3\Lib\site-packages\pywin32_system32
下的两个文件,也就是 pythoncom38.dll
和 pywintypes38.dll
拷贝到 C:\Windows\System32
, 否则执行 jupyter-qtconsole.exe
将会报以下错误:
import win32api ImportError: DLL load failed: 找不到指定的模块”
运行 jupyter-notebook
之后,会报以下错误:
C:\Python38\Scripts>jupyter-notebook.exe
Traceback (most recent call last):
File "c:\python38\lib\runpy.py", line 192, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\python38\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python38\Scripts\jupyter-notebook.exe\__main__.py", line 9, in
File "c:\python38\lib\site-packages\jupyter_core\application.py", line 267, in launch_instance
return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
File "c:\python38\lib\site-packages\traitlets\config\application.py", line 663, in launch_instance
app.initialize(argv)
File "", line 2, in initialize
File "c:\python38\lib\site-packages\traitlets\config\application.py", line 87, in catch_config_error
return method(app, *args, **kwargs)
File "c:\python38\lib\site-packages\notebook\notebookapp.py", line 1679, in initialize
self.init_webapp()
File "c:\python38\lib\site-packages\notebook\notebookapp.py", line 1442, in init_webapp
self.http_server.listen(port, self.ip)
File "c:\python38\lib\site-packages\tornado\tcpserver.py", line 152, in listen
self.add_sockets(sockets)
File "c:\python38\lib\site-packages\tornado\tcpserver.py", line 165, in add_sockets
self._handlers[sock.fileno()] = add_accept_handler(
File "c:\python38\lib\site-packages\tornado\netutil.py", line 279, in add_accept_handler
io_loop.add_handler(sock, accept_handler, IOLoop.READ)
File "c:\python38\lib\site-packages\tornado\platform\asyncio.py", line 99, in add_handler
self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
File "c:\python38\lib\asyncio\events.py", line 501, in add_reader
raise NotImplementedError
NotImplementedError
是由于 python3.8 asyncio 在 windows 上默认使用 ProactorEventLoop 造成的,而不是之前的 SelectorEventLoop。jupyter 依赖 tornado,而 tornado 在 window 上需要使用 SelectorEventLoop,所以产生这个报错
对于用户自己写的,依赖于 tornado 的程序,tornado 官方文档已经说明:
On Windows, Tornado requires the ``WindowsSelectorEventLoop``. This is
the default in Python 3.7 and older, but Python 3.8 defaults to an
event loop that is not compatible with Tornado. Applications that use
Tornado on Windows with Python 3.8 must call
``asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())``
at the beginning of their ``main`` file/function.
而对于像 jupyter 这种依赖于 tornado 的库,则无法用这种方式。目前这个问题已由 python 官方跟踪:https://bugs.python.org/issue37373
临时解决办法:
修改 D:\Python3\Lib\site-packages\tornado\platform\asyncio.py
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
也就是在 import asyncio
之后,手动让 tornado 选择 SelectorEventLoop,这样 jupyter 就可以正常使用了。
所以现在其实不太建议升级到 python3.8
相关 issue: