终于解决了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架构下运行了:

苹果M1芯片如何安装python模块 苹果m1芯片能运行python吗_重新安装

不过马上就发现了一个大问题:

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架构,才能彻底解决问题。

为此,解决方法是删除pythonta-lib包,删除C语言ta-lib包,删除homebrew,再重新安装arm64架构的homebrew,重新安装arm64架构的C语言ta-lib,再重新安装pythonta-lib,步骤如下:

  1. 删除pythonta-lib
$ pip uninstall ta-lib
  1. 删除C语言的ta-lib
$ brew uninstall ta-lib
  1. 删除homebrew,本来删除正常安装的homebrew应该用下面的命令:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
  1. 但是我的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)"

至此,系统清理干净了,下面继续:

  1. 重新安装homebrew,此时可以有三种安装方式:
    4.1. 通过下面命令安装,它可以根据芯片的架构自动安装到正确的路径:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 4.2. 网络连接有问题的同学可以使用下面的命令从国内源安装homebrew:
$ /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
  1. 4.3. 通过homebrew官方release下载pkg文件安装,它也能根据芯片架构自动安装到正确的路径:

    不过通过pkg安装后,还需要将homebrew添加到PATH,否则无法在terminal中使用brew命令:
$ export PATH=$PATH:/opt/homebrew/bin
  1. 然后就可以使用homebrew重新安装C语言的ta-lib包了,注意必须安装arm64架构的包:
$ arch -arm64 brew install ta-lib
  1. 最后重新安装arm64架构的pythonta-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'