PyInstaller打包exe后出现AttributeError:plotly无express属性
解决PyInstaller打包Plotly代码时的
AttributeError: module 'plotly' has no attribute 'express'问题 问题背景
我在Anaconda环境的Jupyter Notebook中编写了myFile.py代码,本地运行完全正常,但用PyInstaller打包为exe后执行报错。
代码内容
import math import pandas as pd pd.options.mode.chained_assignment = None # default='warn' import plotly DF = pd.read_csv('My CSV data file path') myCol = DF['Temp'].value_counts(normalize = True) fig = plotly.express.bar(myCol) fig.show()
打包命令
pyinstaller myFile.py
报错信息
File "_plotly_utils\importers.py", line 39 in __getattr__ AttributeError: module 'plotly' has no attribute 'express' Failed to execute script due to unhandled exception.
已尝试的无效操作
- 使用
--onefile参数打包 - 添加
--hidden-import plotly.express作为隐式导入 - 复制Anaconda环境中的整个plotly包到exe同目录
- 通过
conda update plotly将plotly更新至5.9.0版本 - 尝试Stack Overflow相关问题的已采纳解决方案
可行解决方案
1. 显式导入plotly.express模块
PyInstaller的静态依赖分析无法识别Plotly的动态导入逻辑,直接显式导入plotly.express可让PyInstaller正确捕获依赖:
修改代码如下:
import math import pandas as pd pd.options.mode.chained_assignment = None # default='warn' import plotly.express as px # 显式导入express DF = pd.read_csv('My CSV data file path') myCol = DF['Temp'].value_counts(normalize = True) fig = px.bar(myCol) # 使用px调用绘图方法 fig.show()
2. 通过.spec文件补充完整依赖
若不想修改代码,可生成.spec文件并手动添加Plotly的子模块依赖:
- 生成spec文件:
pyinstaller --name myApp myFile.py - 打开
myApp.spec,在hiddenimports列表中添加Plotly相关子模块:hiddenimports=[ 'plotly.express', 'plotly.express.colors', 'plotly.express.data', 'plotly.express._chart_types', 'plotly.validators' ], - 用spec文件重新打包:
pyinstaller myApp.spec
3. 确保Plotly资源文件被打包
Plotly运行时需要加载内置的模板、数据等资源,打包时需确保这些文件被包含:
- 在代码中显式指定模板,避免动态加载失败:
import plotly.io as pio pio.templates.default = "plotly_white" - 在spec文件的
datas中添加Plotly资源目录路径(替换为你的实际环境路径):datas=[ (r'C:\Users\你的用户名\anaconda3\envs\你的环境名\Lib\site-packages\plotly\data', 'plotly/data'), (r'C:\Users\你的用户名\anaconda3\envs\你的环境名\Lib\site-packages\plotly\templates', 'plotly/templates') ],
内容的提问来源于stack exchange,提问作者Diamoniner12345
相关产品推荐
相关产品推荐

