终于解决了M1芯片导入TA-lib时的ImportError: symbol not found in flat namespace '_TA_ACOS'
问题
被这个问题困扰好几天了。
以前一直使用intel芯片的Macbook,两年前切换成M1芯片的Macbook的时候,为了省事直接使用了time machine把整个机器备份到了新电脑上,因此在M1 Macbook上实际上一直用的是Rosseta转译的python
环境。
最近下决心进行彻底迁移,重新安装了Arm64架构的Anaconda,重新安装了python
环境,python
终于在arm架构下运行了:
不过马上就发现了一个大问题:
TA-lib
无法导入了!导入时报错:
Python 3.8.19 (default, Mar 20 2024, 15:27:52)
[Clang 14.0.6 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import talib
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/anaconda3/envs/py38/lib/python3.8/site-packages/talib/__init__.py", line 93, in <module>
from ._ta_lib import (
ImportError: dlopen(/opt/anaconda3/envs/py38/lib/python3.8/site-packages/talib/_ta_lib.cpython-38-darwin.so, 0x0002): symbol not found in flat namespace '_TA_ACOS'
>>>
这个问题是由于环境切换到M1系统导致的,但是即使重新pip
安装ta-lib
也无法解决,这是因为ta-lib实际上是C
语言包,我们必须确保安装在系统中的C语言talib
包、python
环境、以及python
中的ta-lib
包都是arm64架构才行。同时,我的c
语言ta-lib
包是用homebrew安装的,因此还需要把homebrew也替换成arm64架构,才能彻底解决问题。
为此,解决方法是删除python
的ta-lib
包,删除C
语言ta-lib
包,删除homebrew,再重新安装arm64架构的homebrew,重新安装arm64架构的C
语言ta-lib
,再重新安装python
的ta-lib
,步骤如下:
- 删除
python
ta-lib
包
$ pip uninstall ta-lib
- 删除
C
语言的ta-lib
$ brew uninstall ta-lib
- 删除homebrew,本来删除正常安装的homebrew应该用下面的命令:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
- 但是我的homebrew并没有安装到arm架构Mac的默认路径
'opt/homebrew'
, 而是安装到了intel芯片Mac的默认路径:'usr/local/homebrew'
,因此找到了下面的命令来删除它:
$ PATH=/usr/local/bin:$PATH arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
至此,系统清理干净了,下面继续:
- 重新安装homebrew,此时可以有三种安装方式:
4.1. 通过下面命令安装,它可以根据芯片的架构自动安装到正确的路径:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 4.2. 网络连接有问题的同学可以使用下面的命令从国内源安装homebrew:
$ /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
- 4.3. 通过homebrew官方release下载pkg文件安装,它也能根据芯片架构自动安装到正确的路径:
不过通过pkg安装后,还需要将homebrew添加到PATH,否则无法在terminal中使用brew命令:
$ export PATH=$PATH:/opt/homebrew/bin
- 然后就可以使用homebrew重新安装
C
语言的ta-lib
包了,注意必须安装arm64架构的包:
$ arch -arm64 brew install ta-lib
- 最后重新安装arm64架构的
python
ta-lib
包:
$ arch -arm64 python -m pip install --no-cache-dir ta-lib
如果上面都顺利,现在ta-lib
应该可以正常使用了:
Python 3.8.19 (default, Mar 20 2024, 15:27:52)
[Clang 14.0.6 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import talib
>>> talib.__version__
'0.4.28'