Python3.9导入Prophet模块时ARM Mach-O架构兼容错误修复
问题描述
运行Python 3.9编写的股票预测脚本时出现架构兼容错误,提示/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/cryptography/hazmat/bindings/_rust.abi3.so为Mach-O文件,但架构不兼容(现有'arm64',需'x86_64')。已尝试降级Python、重新安装所有依赖,问题仍未解决。
脚本代码
import streamlit as st from datetime import date import yfinance as yf from fbprophet import Prophet from fbprophet.plot import plot_plotly from plotly import graph_objs as go START = "2015-01-01" TODAY = date.today().strftime("%Y-%m-%d") st.title('Stock Forecast App') stocks = ('GOOG', 'AAPL', 'MSFT', 'GME') selected_stock = st.selectbox('Select dataset for prediction', stocks) n_years = st.slider('Years of prediction:', 1, 4) period = n_years * 365 @st.cache def load_data(ticker): data = yf.download(ticker, START, TODAY) data.reset_index(inplace=True) return data data_load_state = st.text('Loading data...') data = load_data(selected_stock) data_load_state.text('Loading data... done!') st.subheader('Raw data') st.write(data.tail()) # Plot raw data def plot_raw_data(): fig = go.Figure() fig.add_trace(go.Scatter(x=data['Date'], y=data['Open'], name="stock_open")) fig.add_trace(go.Scatter(x=data['Date'], y=data['Close'], name="stock_close")) fig.layout.update(title_text='Time Series data with Rangeslider', xaxis_rangeslider_visible=True) st.plotly_chart(fig) plot_raw_data() # Predict forecast with Prophet. df_train = data[['Date','Close']] df_train = df_train.rename(columns={"Date": "ds", "Close": "y"}) m = Prophet() m.fit(df_train) future = m.make_future_dataframe(periods=period) forecast = m.predict(future) # Show and plot forecast st.subheader('Forecast data') st.write(forecast.tail()) st.write(f'Forecast plot for {n_years} years') fig1 = plot_plotly(m, forecast) st.plotly_chart(fig1) st.write("Forecast components") fig2 = m.plot_components(forecast) st.write(fig2)
报错堆栈
Traceback (most recent call last): File "/Users/srijan/Code/PP/stockpredictor3.py", line 4, in <module> import yfinance as yf File "/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/yfinance/__init__.py", line 23, in <module> from .ticker import Ticker File "/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/yfinance/ticker.py", line 29, in <module> from .base import TickerBase File "/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/yfinance/base.py", line 32, in <module> from .data import TickerData File "/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/yfinance/data.py", line 12, in <module> from cryptography.hazmat.primitives import padding File "/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/cryptography/hazmat/primitives/padding.py", line 11, in <module> from cryptography.hazmat.bindings._rust import ( ImportError: dlopen(/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/cryptography/hazmat/bindings/_rust.abi3.so, 0x0002): tried: '/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/cryptography/hazmat/bindings/_rust.abi3.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/cryptography/hazmat/bindings/_rust.abi3.so' (no such file), '/Users/srijan/miniforge3/envs/PersonalProject/lib/python3.9/site-packages/cryptography/hazmat/bindings/_rust.abi3.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64'))
解决办法
- 确认当前终端架构:执行
uname -m,输出x86_64表示终端在Rosetta 2模式运行,arm64表示原生Apple Silicon模式。 - 重新创建匹配终端架构的conda环境:
- 删除现有环境:
conda env remove -n PersonalProject - 新建对应架构的环境:
- 若终端为x86_64:
CONDA_SUBDIR=osx-64 conda create -n PersonalProject python=3.9 - 若终端为arm64:
CONDA_SUBDIR=osx-arm64 conda create -n PersonalProject python=3.9
- 若终端为x86_64:
- 激活环境:
conda activate PersonalProject - 强制设置环境子目录匹配架构:
- x86_64终端:
conda config --env --set subdir osx-64 - arm64终端:
conda config --env --set subdir osx-arm64
- x86_64终端:
- 删除现有环境:
- 重新安装所有依赖:
pip install streamlit yfinance fbprophet plotly - 验证cryptography架构:执行
file $(python -c "import cryptography; print(cryptography.__file__.replace('__init__.py', 'hazmat/bindings/_rust.abi3.so'))"),输出需与终端架构一致。
备选方案:安装无rust绑定的旧版本cryptography,避免架构冲突:pip install cryptography==3.4.8
内容的提问来源于stack exchange,提问作者Srijan K.
相关产品推荐
相关产品推荐

