Python图像库与libjpeg的错误

2 投票
4 回答
2809 浏览
提问于 2025-04-16 22:33

我在使用CentOS 5系统,想要安装Python图像库(PIL)。我已经安装了libjpeg、libjpeg-devel等,但还是无法在我的Django网站上上传jpeg格式的图片。

我已经多次重新安装PIL,使用过PIP、easy_install2.6和手动编译。每次安装时都显示支持JPEG格式,但就是不让我上传jpeg文件。不过,gif和png格式的图片是可以上传的。

我现在使用的是Python 2.6,PIL版本是1.1.7。

--------------------------------------------------------------------
PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version       1.1.7
platform      linux2 2.6.7 (r267:88850, Jul 28 2011, 12:07:21)
              [GCC 4.1.2 20080704 (Red Hat 4.1.2-50)]
--------------------------------------------------------------------
*** TKINTER support not available
--- JPEG support available
--- ZLIB (PNG/ZIP) support available
--- FREETYPE2 support available
*** LITTLECMS support not available
--------------------------------------------------------------------

有没有什么建议?

谢谢!

4 个回答

0

你的models.py文件里有什么内容?你需要在数据库里有类似这样的东西。

img = models.ImageField("Foo")

这里的Foo是用来存放上传的图片的地方。在重新安装PIL之前,确保你已经安装了libjpeg-devel,如果这样还不行,就运行

easy_install pil | tee pil.log

然后把结果发到这里,这样我们才能更好地帮助你。

1

我也遇到过同样的问题,所以我把我的安装步骤记录下来了。这个过程比较长,你可以在我的博客上找到。

这个教程会帮助你完成以下内容:

  • 一个可用的副本
  • Django框架
  • PIL库
  • 图像处理
  • libjpeg库
  • MySQL数据库
  • Git版本控制
  • Apache服务器
  • mod_wsgi模块
  • easy_install工具
  • pip包管理器
  • django-imagekit库
  • 在CentOS 5.4上使用CDN存储

安装Apache、MySQL、SQLite和其他开发者包

yum install httpd-devel mysql mysql-server
yum install mysql-client mysql-devel
yum install apr-devel sqlite3 sqlite-devel
yum install libjpeg libpng gcc make autoconf
yum install libxslt gettext zlib-devel
yum groupinstall "GNOME Desktop Environment"
yum groupinstall "Development Tools"

这个教程假设你在生产环境中使用MySQL,也可以在开发中使用SQLite。如果你使用的是其他数据库,比如PostgreSQL,那你现在就应该安装相关的文件。另外,请注意,这些并不是你在搭建web服务器时需要的全部包,这只是让你的Django应用能正常工作的最低要求。

添加新用户

groupadd webmaster
useradd -c "username"  -g webmaster -m -s /bin/bash username
passwd username
passw0rd
visudo

在第77行附近,看到“root ALL=(ALL) ALL”后面添加 username ALL=(ALL) ALL

这样你可以切换到你的用户,而不改变root账户。如果你发现某些项目无法运行,你应该使用sudo命令。

在Python 2.4旁边安装Python 2.6

在CentOS 5.4上让Python 2.6正常工作而不破坏任何东西的诀窍是将它与默认的Python 2.4一起安装。不要尝试更新默认的Python 2.4,因为CentOS的一些重要模块需要2.4。为此,你需要将Python配置为安装在/opt/python2.6。进行这一步之前,请确保你已经安装了yum和sqlite-devel,因为Python在编译时会查找sqlite的头文件。

wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz
tar -zxvf Python-2.6.4.tgz
cd Python-2.6.4
./configure --prefix=/opt/python2.6 --with-threads --enable-shared --with-zlib=/usr/include
make
make install
cd ~

在/opt/Python2.6安装完Python后,你需要创建指向它的符号链接。

ln -s /opt/python2.6/lib/libpython2.6.so /usr/lib
ln -s /opt/python2.6/lib/libpython2.6.so.1.0 /usr/lib
ln -s /opt/python2.6/bin/python /usr/local/bin/python
ln -s /opt/python2.6/bin/python /usr/bin/python2.6
ln -s /opt/python2.6/lib/python2.6.so /opt/python2.6/lib/python2.6/config/

运行ldconfig来更新共享库的链接,然后检查你的Python版本,确保你现在可以使用2.6。同时,使用yum测试一下Python 2.4和2.6之间是否有冲突。如果有问题,请仔细检查你的符号链接,确保没有和/usr/bin/python或/usr/bin/python2.4冲突。

/sbin/ldconfig -v
python -V
yum info httpd

安装setuptools、MySQL扩展和Django 1.1

如果你之前安装过setuptools,但需要为2.6重新安装,以便将包安装在/opt/python2.6。为了让Django使用MySQL,你需要下载、构建并安装相应的扩展。

wget http://bit.ly/6E0DNN 
chmod u+x setuptools-0.6c11-py2.6.egg
./setuptools-0.6c11-py2.6.egg --prefix=/opt/python2.6

wget http://bit.ly/6j4uID
tar -zxvf MySQL-python-1.2.3c1.tar.gz
cd MySQL-python-1.2.3c1
python setup.py build
python setup.py install
cd ..

wget http://www.djangoproject.com/download/1.1.1/tarball/
tar -zxvf Django-1.1.1.tar.gz
cd Django-1.1.1
python setup.py build
python setup.py install
cd ..

设置和安装mod_wsgi

大多数Django社区使用wsgi作为与web服务器的接口。我也喜欢使用它,因为它快速且易于设置。这个教程不会详细讲解如何让你的应用使用wsgi(不过我会在最后给出一个例子),但Django项目有一个很好的教程。请注意,这一步非常重要。你可能之前通过yum安装过mod_wsgi,但你需要下载并使用新的2.6版本构建它,以便它能与你的应用正常工作。

wget http://modwsgi.googlecode.com/files/mod_wsgi-2.8.tar.gz 
tar -zxvf mod_wsgi-2.8.tar.gz
cd mod_wsgi-2.8
./configure --with-python=/usr/local/bin/python
make
make install
cd ..

然后你需要编辑Apache的httpd.conf文件,以加载mod_wsgi模块。完成后,重启Apache。

vi /etc/httpd/conf/httpd.conf
LoadModule wsgi_module  /usr/lib64/httpd/modules/mod_wsgi.so
line 787
AddHandler wsgi-script .wsgi

确保在加载模块后重启Apache。

/etc/init.d/httpd restart

为你的虚拟主机创建一个单独的目录

我喜欢把所有的虚拟主机放在一个单独的目录里。

cd /etc/httpd/conf
mkdir vhosts
cd vhosts
vi mysite.com.conf

<VirtualHost 127.0.0.1>
    ServerName localhost

    ErrorLog /www/django_test1/mysite/logs/error_log
    CustomLog /www/django_test1/mysite/logs/access_log combined

    UseCanonicalName Off

    Alias /media/ "/www/django_test1/mysite/media/"
    <Directory "/www/django_test1/mysite/media">
        Order allow,deny
        Options Indexes
        Allow from all
        IndexOptions FancyIndexing
    </Directory>

    Alias /mediaadmin/ "/opt/python2.6/lib/python2.6/site-packages/django/contrib/admin/media/"
    <Directory "/opt/python2.6/lib/python2.6/site-packages/django/contrib/admin/media">
        Order allow,deny
        Options Indexes
        Allow from all
        IndexOptions FancyIndexing
    </Directory>

    WSGIScriptAlias / /www/django_test1/mysite.wsgi
    WSGIDaemonProcess mysite processes=7 threads=1 display-name=%{GROUP}
    WSGIProcessGroup mysite
    WSGIApplicationGroup %{GLOBAL}
</VirtualHost>

创建你的mod_wsgi文件

根据我在网上的一些搜索,最好将你的mod_wsgi文件放在应用的父文件夹中。

mkdir /www
cd /www
mkdir django_test1
cd django_test1
vi mysite.wsgi

#!/opt/python2.6/bin/python

import os, sys

sys.path.append('/www/django_test1/mysite')
sys.path.insert(0, '/www/django_test1')
sys.path.insert(0, '/www/django_test1/mysite')

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
os.environ['PYTHON_EGG_CACHE'] = '/www/django_test1/mysite/.python-eggs'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

保存文件

在mysite中创建一个.python-eggs目录

mkdir .python-eggs
chmod -R 777 .python-eggs

http://mikecantelon.com/story/installing_django_on_centos_5

启动MySQL服务器

/etc/rc.d/init.d/mysqld start

在CentOS上安装PIL

http://athenageek.wordpress.com/2009/06/09/easy_install-pil-not-so-easy/

安装PIP以便使用图像处理

/opt/python2.6/bin/easy_install-2.6 pip

/opt/python2.6/bin/pip install http://effbot.org/downloads/Imaging-1.1.6.tar.gz

安装GIT

http://www.bitsandpix.com/entry/git-installing-git-on-centos-5/

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

yum install git

用另一个用户配置MySQL

mysql --user=root mysql
CREATE USER 'webdev'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'webdev'@'localhost'
IDENTIFIED BY 'password' WITH GRANT OPTION;

创建一个Django项目

/opt/python2.6/bin/django-admin.py startproject mysite

在你的项目中创建一个日志目录,因为mod_wsgi和Apache需要这个目录。

cd mysite
mkdir logs

为你的管理员媒体文件夹创建符号链接

mkdir media
chmod -R 777 media
mkdir mediaadmin

ln -s /opt/python2.6/lib/python2.6/site-packages/django/contrib/admin/media /www/django_test1/mysite/mediaadmin/

配置你的/etc/httpd/conf/httpd.conf文件,以包含项目的基本设置

ServerAdmin admin@appelvm01.centos
HostName appelvm01.centos

ServerName 127.0.0.1

DocumentRoot "/www/django_test1/mysite"

<Directory "/www/django_test1/mysite">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

包含虚拟主机配置文件

Include conf/vhosts/*.conf

在httpd.conf文件末尾添加WSGISocketPrefix

WSGISocketPrefix /var/run/wsgi

确保主机名与Apache配置中的/etc/httpd/conf/httpd.conf中的一致,否则通过运行命令进行更改。

hostname "new_name"

给予权限

chcon -R -h -t httpd_sys_content_t /www/django_test1/mysite

我发现这还不够,所以我不得不关闭SElinux。

vi /etc/selinux/config

设置

SELINUX=disabled

根据一个博客,移除你的-Indexes设置。http://www.thelinuxblog.com/apache-directory-index-forbidden-by-options-directive/

vi /etc/httpd/conf.d/welcome.conf
# -Indexes
Indexes

配置防火墙

sudo vi /etc/sysconfig/iptables-config

确保以下变量设置为“yes”: IPTABLES_SAVE_ON_STOP="yes" IPTABLES_SAVE_ON_RESTART="yes"

打开Web端口:

sudo /sbin/iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
sudo /sbin/iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 443 -j ACCEPT

重启iptables,使用以下命令: sudo /sbin/service iptables stop sudo /sbin/service iptables start 确保规则仍然有效。也可以尝试重启服务器,以确保设置生效。

确保你的MySQL和Apache在重启后始终保持开启。

/sbin/chkconfig --add httpd
/sbin/chkconfig --level 2345 httpd on
/sbin/chkconfig --list httpd

/sbin/chkconfig --add mysqld
/sbin/chkconfig --level 2345 mysqld on
/sbin/chkconfig --list mysqld

通过easy_install安装South,以便轻松进行数据库迁移。

/opt/python2.6/bin/easy_install-2.6 South

安装Django-cumulus以便使用Rackspace/CDN存储。

/opt/python2.6/bin/pip install django-cumulus

/opt/python2.6/bin/pip install -r http://bitbucket.org/richleland/django-cumulus/raw/0.3.3/requirements.txt

/opt/python2.6/bin/easy_install-2.6 django-imagekit

现在你应该可以访问你的服务器IP地址,并看到欢迎页面!

从这里开始,你可以开始开发你的应用,应该能够启用管理员的自动发现,并设置URL,以便访问管理部分。

2

确保你没有安装其他版本的libjpeg库,因为可能是那个版本在被使用。你可以通过以下命令来检查一下:

lsof | grep libjpeg

撰写回答