TA-Lib 的 Python 包装器:导入失败

Posted

技术标签:

【中文标题】TA-Lib 的 Python 包装器:导入失败【英文标题】:Python Wrapper for TA-Lib: Import Failure 【发布时间】:2012-08-05 01:30:05 【问题描述】:

我遇到了 @mrjbq7 的出色作品,他为 TA-Lib 编写了一个 Python wrapper - 一个用 C 编写的开源技术分析库。我已经安装了两个 TA-Lib(就像通常的configuremakemake install) 以及包装器(使用包含的 setup.py 脚本)按照说明,但我在尝试导入模块或运行示例脚本时收到导入错误(相同导入错误)。

我在 Linux 机器上 (sys.platform == 'linux2') 并使用 Python 2.7 的 Enthought 发行版。

我已将 TA-Lib 安装到其默认位置,该位置由包装器 setuptools 脚本指向(您可以查看 setup.py here 的源代码):

bash$ ls -la /usr/local/include/ta-lib/
total 240
drwxr-xr-x 2 root root   4096 2012-08-04 08:54 .
drwxr-xr-x 3 root root   4096 2012-08-04 08:54 ..
-rw-r--r-- 1 root root  19930 2012-08-04 08:54 ta_abstract.h
-rw-r--r-- 1 root root   4792 2012-08-04 08:54 ta_common.h
-rw-r--r-- 1 root root  12391 2012-08-04 08:54 ta_defs.h
-rw-r--r-- 1 root root 181115 2012-08-04 08:54 ta_func.h
-rw-r--r-- 1 root root   1849 2012-08-04 08:54 ta_libc.h

bash$ ls -la /usr/local/lib
total 4956
drwxr-xr-x  3 root root    4096 2012-08-04 08:54 .
drwxr-xr-x 12 root root    4096 2011-04-06 23:47 ..
-rw-r--r--  1 root root 3063180 2012-08-04 08:54 libta_lib.a
-rwxr-xr-x  1 root root     837 2012-08-04 08:54 libta_lib.la
lrwxrwxrwx  1 root root      18 2012-08-04 08:54 libta_lib.so -> libta_lib.so.0.0.0
lrwxrwxrwx  1 root root      18 2012-08-04 08:54 libta_lib.so.0 -> libta_lib.so.0.0.0
-rwxr-xr-x  1 root root 1983243 2012-08-04 08:54 libta_lib.so.0.0.0
drwxr-xr-x 11 root root    4096 2011-04-07 17:10 pythonEPD

然后我使用python setup.py install成功构建了Cython代码:

bash$ python setup.py install
running install
running build
running build_ext
building 'talib' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -O2 -I/usr/local/lib/pythonEPD/include -fPIC -I/usr/local/lib/pythonEPD/lib/python2.7/site-packages/numpy/core/include -I/usr/local/include/ta-lib/ -I/usr/local/lib/pythonEPD/include/python2.7 -c talib.c -o build/temp.linux-i686-2.7/talib.o

...
[truncated - lots of warnings regarding pointer types]
---

gcc -pthread -shared -g -L/usr/local/lib/pythonEPD/lib build/temp.linux-i686-2.7/talib.o -L/usr/local/lib/ -L. -lta_lib -lpython2.7 -o build/lib.linux-i686-2.7/talib.so
running install_lib
copying build/lib.linux-i686-2.7/talib.so -> /usr/local/lib/pythonEPD/lib/python2.7/site-packages
running install_egg_info
Writing /usr/local/lib/pythonEPD/lib/python2.7/site-packages/TA_Lib-0.4.0-py2.7.egg-info

然而,当我尝试运行示例脚本或导入 talib 时,我收到以下导入错误:

bash$ python
Enthought Python Distribution -- www.enthought.com
Version: 7.0-2 (32-bit)

Python 2.7.1 |EPD 7.0-2 (32-bit)| (r271:86832, Nov 29 2010, 13:52:51) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import talib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: libta_lib.so.0: cannot open shared object file: No such file or directory

setup.py 脚本清楚地包含扩展类中已编译 TA-Lib 代码的适当路径,但我注意到 Cython 代码构建中的 gcc 命令不包括对 /usr/local/lib 的引用路径...(不确定这是否是问题所在?)。

我希望有人遇到过这个模块或类似情况?

【问题讨论】:

【参考方案1】:

关闭@rcovre,我在@mrjbq 的github 网站上发布了一个问题,他给出了非常简单的解决方案:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

对于永久解决方案,必须将 /usr/local/lib 添加到 /etc/ld.so.conf 作为 root 然后运行 ​​/sbin/ldconfig(也作为 root)。

像魅力一样工作。

https://github.com/mrjbq7/ta-lib/issues/6

【讨论】:

【参考方案2】:

你的 python 路径呢?

也许所有编译的库都可能存储在 sys.path 的某个目录中,以供您的 python 解释器查看。例如在 '/usr/local/lib/python2.7/dist-packages' 中,而不仅仅是在 '/usr/local/lib' 中(如在安装脚本中)。

【讨论】:

【参考方案3】:

你应该先安装ta-lib,python库ta-lib是基于这个c库的。

【讨论】:

以上是关于TA-Lib 的 Python 包装器:导入失败的主要内容,如果未能解决你的问题,请参考以下文章

Spotipy(Spotify 的 Web API Python 包装器)示例失败

导入错误。pybind11和PCL加载DLL失败。

导入pygame时“通用包装器中没有匹配的架构”

Python - 导入包失败

Python导入torch包的方法

我可以在包装函数之前修补 Python 装饰器吗?