panel serve运行notebook报hvplot.pandas模块找不到错误
问题描述
使用hvplot绘制交互式图表时程序运行异常,抛出错误:ModuleNotFoundError: No module named 'hvplot.pandas'; 'hvplot' is not a package
运行环境版本
python 3.10.4 conda 4.13.0 panel 0.13.0 py310h06a4308_0 pyviz_comms 2.0.2 pyhd3eb1b0_0 holoviews 1.14.8 pyhd3eb1b0_0 hvplot 0.7.3 pyhd3eb1b0_1 pandas 1.4.2 py310h295c915_0
已验证现象
- 终端Python交互环境中导入
hvplot.pandas完全正常,可正常读取到包路径:
(hvplots) xy@win-712M7G3:/mnt/c/Users/xy$ python Python 3.10.4 (main, Mar 31 2022, 08:41:55) [GCC 7.5.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import hvplot.pandas >>> hvplot.pandas.__file__ '/home/xy/envs/hvplots/lib/python3.10/site-packages/hvplot/pandas.py'
- 执行
panel serve hvplot_interactive.ipynb命令运行notebook文件时触发上述报错,运行日志如下:
(hvplots) xy@win-712M7G3:/mnt/c/Users/xy$ panel serve hvplot_interactive.ipynb 2022-07-07 15:41:10,707 Starting Bokeh server version 2.4.2 (running on Tornado 6.1) 2022-07-07 15:41:10,741 User authentication hooks NOT provided (default user enabled) 2022-07-07 15:41:10,742 Bokeh app running at: http://localhost:5006/hvplot_interactive 2022-07-07 15:41:10,742 Starting Bokeh server with process id: 3112 /home/xy/envs/hvplots/lib/python3.10/site-packages/pandas/__init__.py 2022-07-07 16:05:08,882 Error running application handler <bokeh.application.handlers.notebook.NotebookHandler object at 0x7ff651f7d780>: No module named 'hvplot.pandas'; 'hvplot' is not a package File 'hvplot_interactive.ipynb', line 38, in <module>: "source": [ Traceback (most recent call last): File "/home/xy/envs/hvplots/lib/python3.10/site-packages/bokeh/application/handlers/code_runner.py", line 231, in run exec(self._code, module.__dict__) File "/mnt/c/Users/xy/hvplot_interactive.ipynb", line 38, in <module> "source": [ ModuleNotFoundError: No module named 'hvplot.pandas'; 'hvplot' is not a package 2022-07-07 16:05:09,121 WebSocket connection opened 2022-07-07 16:05:09,121 ServerConnection created ^C Interrupted, shutting down
故障原因
这是Python导入机制导致的经典同名包遮挡问题:
Python执行导入时会优先从当前运行工作目录搜索匹配的模块/包,你执行panel serve命令所在的目录下,存在自定义命名为hvplot.py的脚本文件,或者命名为hvplot的文件夹,Python启动服务导入时会先命中这个自定义的同名文件/文件夹,把它当成官方安装的hvplot包去加载,这个自定义对象里自然没有pandas子模块,就会抛出'hvplot' is not a package的错误。
交互环境下导入正常,大概率是测试交互导入时,当前目录下还没生成这个同名文件,或者当时的工作目录和执行panel serve时的工作目录存在差异。
日志里出现的"source": [报错片段,是notebook解析异常带出的ipynb json结构字段,不是核心故障点。
解决步骤
- 切到存放
hvplot_interactive.ipynb、执行panel serve命令的目录,执行ls查看所有文件,找到名为hvplot.py的自定义脚本、或者名为hvplot的自定义文件夹,将其重命名为和第三方包不冲突的名称,比如hvplot_test.py。 - 如果没找到上述同名文件/文件夹,直接执行
rm -rf __pycache__清理当前目录下的Python编译缓存,避免旧缓存干扰模块导入。 - 清理完成后重新执行
panel serve hvplot_interactive.ipynb即可正常运行。
内容的提问来源于stack exchange,提问作者sjd
相关产品推荐
相关产品推荐

