在Mac OSX SL上,Buildout/Python/Django/PIL报错“异常值: _imaging C模块未安装”?

2 投票
1 回答
1965 浏览
提问于 2025-04-15 18:23

我在用Buildout来管理我的Django项目,里面用到了FeinCMS。现在在我的Mac OSX Snow Leopard上本地环境设置得很好,使用runserver的时候没有任何错误。但是,当我在管理后台用FeinCMS上传图片时,却出现了一个错误:“异常值:_imaging C模块没有安装”。

我的错误追踪信息在这里:http://dpaste.com/149492/

我的buildout.cfg文件是这样的:

   [buildout]
   parts =
        zlib
        libjpeg
        PILwoTk
        django-mptt
        django-staticfiles
        django

    eggs =
        PILwoTk
        feincms

    [zlib]
    recipe = hexagonit.recipe.cmmi
    url = http://www.zlib.net/zlib-1.2.3.tar.gz
    configure-options = --shared

    [libjpeg]
    recipe = hexagonit.recipe.cmmi
    url = http://www.ijg.org/files/jpegsrc.v8.tar.gz

    [PILwoTk]
    recipe = zc.recipe.egg:custom
    find-links = http://download.zope.org/distribution/
    include-dirs =
        ${zlib:location}/include
        ${libjpeg:location}/include
    library-dirs =
        ${zlib:location}/lib
        ${libjpeg:location}/lib
    rpath =
        ${zlib:location}/lib
        ${libjpeg:location}/lib

    [django-mptt]
    recipe = infrae.subversion
    urls = http://django-mptt.googlecode.com/svn/trunk/mptt mptt

    [django-staticfiles]
    recipe = mercurialrecipe
    repository = http://bitbucket.org/jezdez/django-staticfiles/

    [django]
    recipe = djangorecipe
    version = 1.1.1
    project = recoilmedia
    eggs = ${buildout:eggs}
    extra-paths =
        ${django-mptt:location}
        ${django-staticfiles:location}

我在FeinCMS的讨论组和Django的IRC/讨论组里问过这个问题,但没有人能给我任何帮助。我在网上搜索了很多解决方案,但还是没有找到一个能用的。这个问题让我很烦,我今天都被这个困住了。有没有人知道这可能是什么问题呢?

1 个回答

2

我今天也遇到了同样的问题,找到了解决办法。问题在于,PIL(Python Imaging Library)会寻找32位的libjpeg库,而Snow Leopard系统默认会把这个库编译成x86_64格式。我们可以通过修改libjpeg的设置来解决这个问题,修改后的样子应该是这样的:

[libjpeg]
recipe = hexagonit.recipe.cmmi
url = http://www.ijg.org/files/jpegsrc.v8.tar.gz
environment =
  CC=gcc -arch i386

你可以通过运行以下命令来检查一下_imaging.so使用的是哪个库:

otool -L path/to/PIL/_imaging.so

运行后应该会输出一行,指向你构建目录中的libjpeg.8.dylib

补充:再想想,使用CC="gcc -arch i386" bin/buildout来运行buildout也可以解决问题。如果你想编译一个包含多种架构的二进制文件,记得使用GCC-4.0,并添加CPP:CC="gcc-4.0 -arch i386 -arch ppc" CPP="gcc-4.0 -E" bin/buildout

撰写回答