Python图像库与libjpeg的错误
我在使用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 个回答
你的models.py文件里有什么内容?你需要在数据库里有类似这样的东西。
img = models.ImageField("Foo")
这里的Foo是用来存放上传的图片的地方。在重新安装PIL之前,确保你已经安装了libjpeg-devel,如果这样还不行,就运行
easy_install pil | tee pil.log
然后把结果发到这里,这样我们才能更好地帮助你。
我也遇到过同样的问题,所以我把我的安装步骤记录下来了。这个过程比较长,你可以在我的博客上找到。
这个教程会帮助你完成以下内容:
- 一个可用的副本
- 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,以便访问管理部分。
确保你没有安装其他版本的libjpeg库,因为可能是那个版本在被使用。你可以通过以下命令来检查一下:
lsof | grep libjpeg