Ubuntu Oneiric 上的 scikits.audiolab - ImportError: 没有名为 _sndfile 的模块

10 投票
3 回答
7193 浏览
提问于 2025-04-17 08:08

好吧,我想在Python中做一些基本的信号处理,发现了一个很棒的库叫做 scikits.audiolab

可是找不到任何PPA(个人包档案)。没办法。我想我可以通过简单地在我的Ubuntu Oneiric服务器上安装它:

sudo aptitude install libsndfile-dev

然后我执行了:

sudo easy_install scikits.audiolab

但是,这个操作失败了,出现了:

error: sndfile (http://www.mega-nerd.com/libsndfile/) library not found.
Directories to search for the libraries can be specified in the
site.cfg file, in section [sndfile].

这是什么情况?我查了一下 libsndfile1-dev 的文件列表:

japsu@helios ~ $ apt-file list libsndfile1-dev
libsndfile1-dev: /usr/include/sndfile.h
libsndfile1-dev: /usr/include/sndfile.hh
libsndfile1-dev: /usr/lib/x86_64-linux-gnu/libsndfile.a
libsndfile1-dev: /usr/lib/x86_64-linux-gnu/libsndfile.la
libsndfile1-dev: /usr/lib/x86_64-linux-gnu/libsndfile.so
libsndfile1-dev: /usr/lib/x86_64-linux-gnu/pkgconfig/sndfile.pc
[...]

奇怪,库文件放到了不标准的目录里?真是个糟糕的打包者。

没办法。我下载了 scikits.audiolab 的源代码,写了一个 site.cfg 文件,内容像这样:

[sndfile]
include_dirs = /usr/include
library_dirs = /usr/lib/x86_64-linux-gnu/
sndfile_libs = sndfile

现在执行 python setup.py buildsudo setup.py install 都成功完成了。

接下来,我启动了一个Python环境,尝试执行 from scikits.audiolab import sndfile

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "scikits/audiolab/__init__.py", line 25, in <module>
    from pysndfile import formatinfo, sndfile
  File "scikits/audiolab/pysndfile/__init__.py", line 1, in <module>
    from _sndfile import Sndfile, Format, available_file_formats, \
ImportError: No module named _sndfile

但是:

>> sys.path
['',
 '/usr/bin',
 '/usr/lib/pymodules/python2.7',
 '/usr/local/lib/python2.7/dist-packages/scikits.audiolab-0.11.0-py2.7-linux-x86_64.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/IPython/Extensions',
 u'/home/japsu/.ipython']

而且 _sndfile.so 文件在这个路径下找到了:/usr/local/lib/python2.7/dist-packages/scikits.audiolab-0.11.0-py2.7-linux-x86_64.egg/scikits/audiolab/pysndfile/_sndfile.so

所以,我的问题是:

  1. 到底发生了什么?为什么Python找不到 _sndfile.so
  2. 有没有人在2011年成功在2011年的Linux发行版上使用过 scikits.audiolab?你是怎么做到的?
  3. 有没有好的替代库可以将超大的(比如10GB / 8小时)WAV文件分块读取到NumPy中?

3 个回答

0

如果你不想看到关于alsa头文件的警告,那就直接安装这个库。

可以用这个命令:sudo apt-get install libasound2-dev

我这样做就解决了问题。

0

编辑:我刚意识到情况并不是这样,因为pysndfile似乎是打包在一起的……我不应该在早上第一件事就回答问题;)

回答第一个问题:Sndfile是一个C语言写的库,你很可能需要安装它的Python封装:http://code.google.com/p/libsndfile-python/

4

有人建议我检查一下 ldd _sndfile.so。我照做了,结果得到了

    linux-vdso.so.1 =>  (0x00007fffd3dea000)
    libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007f2bfbb5b000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2bfb93e000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2bfb59e000)
    libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007f2bfb354000)
    libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007f2bfae85000)
    libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007f2bfac58000)
    libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007f2bfaa51000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2bfa7cd000)

有趣的是!这里面提到了很多文件格式的库,可能我并没有安装这些库。

于是我执行了 sudo aptitude install flac vorbis-tools,结果成功了!

In [1]: from scikits.audiolab import sndfile
/usr/local/lib/python2.7/dist-packages/scikits.audiolab-0.11.0-py2.7-linux-x86_6                                     
4.egg/scikits/audiolab/soundio/play.py:48: UserWarning: Could not import alsa ba                                     
ckend; most probably, you did not have alsa headers when building audiolab
warnings.warn("Could not import alsa backend; most probably, "

现在我可以暂时忽略那个关于缺少ALSA支持的警告,因为它可能是用来本地录音和播放的,而我这台机器本来就是个服务器。

如果在 scikits.audiolab 的构建脚本中,缺少 libFLAClibvorbislibvorbisenc 能够直接导致构建失败,那就简单多了……毕竟,最后的错误信息根本没有提到这些库。

撰写回答