存档

‘linux’ 分类的存档

屏蔽ip地址

2009年10月14日 roboter 没有评论

在nginx中可以直接屏蔽某些IP地址,加上如下语句即可:

deny 221.194.132.0/24;

这样这些ip访问网站的时候,会得到403错误,但有一个问题,访问记录会保存到error.log中,有些垃圾爬虫得到了403错误,还是不断访问,导致log很大,好在可以使用iptables屏蔽:

sudo iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 221.194.132.0/24

这样nginx也可以轻松一些了。

分类: linux 标签:

mysql错误

2009年5月1日 roboter 没有评论

ubuntu8.04下使用apt-get安装mysql的缺省版本是5.0.5,安装完成时候,出现一些问题,无法启动mysqld,提示如下:

* Checking for corrupt, not cleanly closed and upgrade needing tables.

查了一下,好像没有什么好的解答,似乎这个提示和无法启动mysqld没有什么关系,查看mysql的log,也没有什么记录下来。所以干脆用源代码来进行安装,下了最新的5.1.34。在安装mysql之前,还需要安装ncurses这个库,安装完成之后,sudo ldconfig即可。

mysql安装完成之后,启动mysql,报如下错误:

Manager of pid-file quit without updating file.

Google之后,找到一个老外的提示,在新安装mysql的时候,需要执行mysql_install_db进行mysql插件的初始化。

 

总结:mysql一般的安装顺序是:

  1. ./configure –prefix=/usr/local/mysql
  2. make
  3. make install
  4. scripts/mysql_install_db
  5. 设定权限
  6. chown -R root  /usr/local/mysql
    chown -R mysql /usr/local/mysql/var
    chgrp -R mysql /usr/local/mysql

分类: linux 标签:

linux操作命令记录

2009年4月23日 roboter 没有评论

删除大小为0的文件

find . -name "*" -type f -size 0c | xargs -n 1 rm -f

但是如果文件名有空格,则不能删除,但是可以将带空格的文件名改成没有空格,则就可以删除了。

命令如下:

for file in *;do mv "$file" "$(echo $file|tr -d ‘ ‘)";done

 

修改linux系统本地时间为东八区

cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

设定后台进程:

crontab -e
00 00 * * * /bin/bash  /var/xxx.sh

设定nginx自动切割日志:

#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/var/log/nginx/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}localhost.access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/localhost.access_$(date -d "yesterday" +"%Y%m%d").log
#kill -USR1 `cat /var/run/nginx.pid`
killall –s USR1 nginx

查看nginx状态,参考http://wiki.nginx.org//NginxChsStubStatusModule?highlight=(status)

location /nginx_status {
 # copied from http://blog.kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/
 stub_status on;
 access_log   off;
 allow SOME.IP.ADD.RESS;
 deny all;
}
分类: linux 标签:

python 图片处理

2009年4月8日 roboter 1 条评论

有一堆gif图片,需要处理,python有一个PIL库,处理起来很方便,但是转换的效果很有问题。如: 这一张透明的gif图片,使用简单的保存语句:

from PIL import Image

im = Image.open(’9.gif’)
transparency = im.info['transparency']
im.save(’output.gif’ ,transparency=transparency )

得出的output.gif为 ,多了一些乱七八糟的点。怀疑是我的windows系统环境有问题,然后拿到了ubuntu系统上测试,也是如此,不甘心,在ubuntu上下载了一个python 2.5.4,再下载了PIL的源码进行编译,现象依旧。然后再跑到国外的主机上进行测试,也是一样,不过转换出来的大小都不太一样,有几十个字节的差异。

在open之后,我立即打印了im的数据

print list(im.getdata())

按照正常的话,黑白gif应该只有0和1的点,但是发现下面有很多大于1的点:

[0, 0, 0, 0, 192, 48, 30, 30, 241, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 100, 0, 0, 90, 0, 0, 100, 1, 0, 100, 2, 0, 107, 1, 0, 90, 1, 0, 100, 1, 0, 100, 2, 0
, 107, 2, 0, 90, 2, 0, 100, 0, 0, 0, 1, 1, 1, 1, 1, 0, 3, 0, 104, 0, 0, 4, 100, 0, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, 2, 100, 6, 0, 60, 0, 0, 0, 0, 1, 0, 0, 0, 1, 4,
100, 9, 0, 2, 100, 10, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 60, 4, 100, 13, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 100, 15, 0, 60, 90, 4, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 100,
17, 0, 101, 3, 0, 105, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 131, 0, 0, 89, 90, 0, 0, 1, 0, 0, 0, 1, 0, 0, 7, 0, 101, 2, 0, 105, 8, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 13
1, 3, 0, 1, 101, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 131, 2, 0, 1, 101, 2, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 131, 2, 0, 1, 101, 2, 0, 105, 10, 0, 100, 20, 0, 100, 22,
0, 131, 2, 0, 1, 101, 2, 0, 105, 10, 0, 100, 20, 0, 100, 23, 0, 131, 2, 0, 1, 100, 2, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

尝试将大于1的点清0,再putdata回去,结果是干净了一点,但还有一些污点,可能本来是一些0的点被染成了1。

该gif图片的格式为GIF89a,转存之后为GIF87a。

我又尝试了一些非透明的gif,这样的转存没有问题。难道是PIL对透明gif处理有问题?google了很多文章,都没有发现什么解决方案或者类似的问题,老外写的文章PIL Tips: Converting Between PNG and GIF,倒是有很多例子,不过好像没有碰到我的这个问题。

————————————————————————

没辙了,看看有没有其他的图形库。发现了imagemagick。有python接口,提供了命令行工具。于是在ubuntu上用sudo apt-get install python-pythonmagick安装,下了一堆包,安装完成,在site-packages目录没有发现任何新东西,不知道给装到哪里去了。当然就无法import PythonMagick了。罢了,还是手工编译安装吧。

imagemagick很顺利的编译安装,听说python接口手工安装非常麻烦,也不用python接口了,直接使用命令行进行处理。看了大量的例子帮助,明白了一些基本用法,直接在命令行输入下列指令:

convert 9.gif output.gif

这回成功了,output.gif和9.gif图片一样的。但是在将png转换为gif的时候报错:

convert    gtk1.png  gtk1.gif
convert: no decode delegate for this image format

google了一下,应该是少了一些部件。需要到(http://www.imagemagick.org/download/delegates/)下载所缺少的库进行安装,之后imagemagick需要再重新configue ,make install.

分类: linux, python 标签:

上传文件的跨域处理

2009年4月6日 roboter 没有评论

为了减轻主服务器的负担,希望把图片的处理单独拿出来,由图片服务器来处理图片上传,浏览等操作。图片上传使用了ajax方式,采用了ajaxfileupload控件,它动态生成了一个iframe,由iframe来接受上传结果。以前的操作都在www.***.com上处理,这个控件用得不错,分开之后,由img.***.com来负责上传,结果问题就来了,iframe的contentWindow以及contentDocument下面的document拒绝访问。google之后,发现应该是跨域问题,按照道理来说,两个子域的跨域应该很好解决。无非是设置document.domain,主页面中如下设置:

<script language="text/javascript">
    document.domain = "***.com";
</script>

在iframe中的onload事件函数中,也设置了document.domain = "***.com";测试了一下,行不通,还是会报“拒绝访问”,虽然Firebug已经看到了返回值。对javascript不是很熟悉,不知道iframe中这样设置document.domain是否合法。

然后再google了一堆资料,针对跨域的处理有很多方式:jquery的jsonp技术,动态地添加一个<script>标签,因为script标签的src属性是没有跨域的限制,但是好像只能get,不支持post。还有通过服务器中转,数据先到达www.***.com,由www服务器发送到img服务器进行处理,这样也没有问题,但是数据绕了一圈,费时费力。

这个时候想起了nginx的代理设置,是否能够将www服务器的目录映射成img服务器呢?我想应该可以的,那就尝试一下。

首先给ubuntu装上dns服务器,可以模拟这些域名进行测试。然后配置nginx如下:

upstream hosts_www_com {
    server 192.168.1.2:80;
}
server {
    listen       80;
    server_name  www.***.com;

    access_log  /var/log/nginx/***.host.access.log;   

    location ~ ^/imgupload/ {
        proxy_pass        http://192.168.1.129;  #图片服务器的ip
        proxy_set_header  X-Real-IP  $remote_addr;

        proxy_redirect off;

    }

    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_pass http://hosts_www_com;
        proxy_set_header  x-real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

然后再测试一下,OK了。

分类: linux 标签:

nginx 配置

2009年3月27日 roboter 没有评论

如果需要配置反向代理,则nginx编译的时候需要有–with-http_realip_module参数,于是重新配置编译了一下,这次把大部分参数都加上了

./configure –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –pid-path=/var/run/nginx.pid –lock-path=/var/lock/nginx.lock –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/body –http-proxy-temp-path=/var/lib/nginx/proxy –http-fastcgi-temp-path=/var/lib/nginx/fastcgi –prefix=/usr –with-http_stub_status_module –with-http_realip_module –with-http_dav_module –with-http_flv_module –with-http_sub_module –with-http_addition_module

反向代理配置参数如下:

upstream hosts_xxx_com {
server www.destsite.com:80;
}
server {
listen       80;
server_name  www.xxx.com;

access_log  /var/log/nginx/xxx.host.access.log;

location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_pass http://hosts_xxx_com; #这个可以取任意名字,和upstream的名字相同即可
proxy_set_header  x-real-IP  $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

有时候需要需要保护一些目录,限制某些ip访问,可以如下设置:

location ^~ / {
allow   127.0.0.1;
allow   192.168.1.2;#服务器ip
deny    all;
}

如果需要禁止整个域名的访问,可以设置在server中:

allow   192.168.1.2;#自已电脑的ip
deny    all;

可以把限制ip单独弄出一个文件deny.conf,在nginx.conf中include deny.conf;。如果需要动态添加一些限制ip,则可以修改这个deny.conf文件,修改完成之后,通过信号告诉nginx,限制就生效了。

防盗链设置:使用别名配置

location /res/ {
alias   /opt/Src/;
valid_referers none blocked server_names *.xxx.com ;
if ($invalid_referer) {
return 403;
}
}

nginx的信号如下:转摘自常用的 Nginx 参数和控制

通过信号对 Nginx 进行控制
Nginx 支持下表中的信号:
信号名         作用描述
TERM, INT         快速关闭程序,中止当前正在处理的请求
QUIT         处理完当前请求后,关闭程序
HUP         重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求
USR1         重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件
USR2         平滑升级可执行程序
WINCH         从容关闭工作进程

有两种方式来通过这些信号去控制 Nginx,第一是通过 logs 目录下的 nginx.pid 查看当前运行的 Nginx 的进程 ID,通过 kill – XXX <pid> 来控制 Nginx,其中 XXX 就是上表中列出的信号名。如果您的系统中只有一个 Nginx 进程,那您也可以通过 killall 命令来完成,例如运行 killall – s HUP nginx 来让 Nginx 重新加载配置。

分类: linux 标签:

ubuntu nginx django安装记录

2009年3月26日 roboter 1 条评论

需要安装一台服务器,主要作为图片的处理存储显示等功能,选择了ubuntu作为服务器,ubuntu的服务器版本只有500多M,非常小巧,同时使用人数众多,有什么问题能够很好解决。

使用的是2M带宽,ubuntu 8.04只用40多分钟就全部下下来了。安装很快完成,进入了配置。

首先尝试安装django,直接使用sudo apt-get install python-django,结果把0.96.1的版本给弄下来了,只能删除这个包了,sudo apt-get remove python-django,直接wget http://www.djangoproject.com/download/1.0.2/tarball/,下了一个1.0.2版本,顺利安装,然后又安装了PIL图形处理库,这次直接用sudo apt-get install python-imaging,PIL的最后一个版本在06年底发布,两年多了,没有再发布新版本,但还是有很多地方在用。

nginx很牛,所以想试试。nginx 8.04已经有了一个0.5版本,太老了,从nginx网站下了一个当前最新的0.7.44版本,开始configure,报没有pcre,zlib等模块。打算使用zlib,pcre等的最新版本,就使用wget下了最新的模块,config没有问题,却报没有make,ubuntu 8.04.2服务版本连make都没有,真是够简洁的。没有make,也没有gcc,g++等工具了,不过都可以用apt下载安装,还是方便。

nginx0.5 已经在服务器中配置好了,包括在/etc/init.d中的脚本,所以就打算覆盖安装,可以省一些事情。nginx 0.5的配置参数为

–conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –pid-path=/var/run/nginx.pid –lock-path=/var/lock/nginx.lock –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/body –http-proxy-temp-path=/var/lib/nginx/proxy –http-fastcgi-temp-path=/var/lib/nginx/fastcgi –with-debug –with-http_stub_status_module –with-http_flv_module –with-http_ssl_module –with-http_dav_module。

将相关的路径参数拷贝下来,再加上设定–prefix=/usr。其他的参数不要,这样就顺利安装了。执行/etc/init.d/nginx start ,看到了欢迎页面。

还需要安装flup,django站点中的flup链接报错,google了一下,找到1.0.1的下载地址http://www.saddi.com/software/flup/dist/flup-1.0.1.tar.gz,直接下载安装。

拷贝django提供的脚本,进行部分修改,可以方便启动django:

#!/bin/bash

# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"

cd $PROJDIR
if [ -f $PIDFILE ]; then
    kill `cat -- $PIDFILE`
    rm -f -- $PIDFILE
fi
exec python manage.py runfcgi pidfile=$PIDFILE host=127.0.0.1 port=8080

可以将这个脚本放入/etc/init.d/目录下,再在rcx.d目录加上一个链接,就可以实现开机自动启动django。

在/etc/nginx/nginx.conf文件中,主要server中配置,加上如下语句:

server {
listen 80;
server_name localhost;
access_log    /var/log/nginx/localhost.access.log;
location / {
# host and port to fastcgi server
fastcgi_pass 127.0.0.1:8080;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_param REMOTE_ADDR           $remote_addr;
fastcgi_param SERVER_PROTOCOL       $server_protocol;
fastcgi_param SERVER_PORT           $server_port;
fastcgi_param SERVER_NAME           $server_name;
fastcgi_intercept_errors off;
}
location ^~ /media/ {
alias  /usr/lib/python2.5/site-packages/django/contrib/admin/media/;
}
location ~* ^.+\.(gif|png|jpg|jpeg|css|swf|htm|html|asp|php|jsp|js|doc|txt)$ {
root   /usr/lib/python2.5/site-packages/django/contrib/admin/media/;
access_log   off;
}
}

现在可以看到页面了,但是,还有问题!

使用了mysql作为django的后台数据库,mysql是ubuntu帮忙安装好的,结果python manage.py syncdb的时候报错:

_mysql_exceptions.Warning: Incorrect string value: ‘\xE4\xB8\x8A\xE4\xBC\xA0…’ for column ‘name’ at row 1

估计是字符编码的问题,难道mysql缺省不是utf8吗?查了一下,默认的是Latin1编码,在/etc/my.cnf中,[client]和[mysqld]下面均加上default-character-set=utf8,这样变成了utf8的编码,这个问题解决了。

然后可以看到首页内容了,以为应该差不多了。然后依然还有问题:进入admin界面,报错:

Unhandled Exception

An unhandled exception was thrown by the application.

检查了error.log,如下:

2009/03/25 23:26:05 [error] 17966#0: *6 FastCGI sent in stderr: “” while reading response header from upstream, client: 192.168.1.2, server: localhost, request: “GET /admin/ HTTP/1.1″, upstream: “fastcgi://127.0.0.1:8080″, host: “192.168.1.129″
2009/03/25 23:26:05 [error] 17966#0: *6 FastCGI sent in stderr: “Traceback (most recent call last):
File “/usr/lib/python2.5/site-packages/flup-1.0.1-py2.5.egg/flup/server/fcgi_base.py”, line 558, in run
protocolStatus, appStatus = self.server.handler(self)
File “/usr/lib/python2.5/site-packages/flup-1.0.1-py2.5.egg/flup/server/fcgi_base.py”, line 1116, in handler
result = self.application(environ, start_response)
File “/usr/lib/python2.5/site-packages/django/core/handlers/wsgi.py”, line 243, in __call__
response = middleware_method(request, response)
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/middleware.py”, line 35, in process_response
request.session.save()
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/db.py”, line 52, in save
session_key = self.session_key,
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/base.py”, line 152, in _get_session_key
self._session_key = self._get_new_session_key()
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/base.py”, line 144, in _get_new_session_key
if not self.exists(session_key):
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/db.py”, line 25, in exists
Session.objects.get(session_key=session_key)
File “/usr/lib/python2.5/site-packages/django/db/models/manager.py”, line 93, in get
return self.get_query_set().get(*args, **kwargs)
File “/usr/lib/python2.5/site-packages/django/db/models/query.py”, line 304, in get
num = len(clone)
File “/usr/lib/python2.5/site-packages/django/db/models/query.py”, line 160, in __len__
self._result_cache = list(self.iterator())
File “/usr/lib/python2.5/site-packages/django/db/models/query.py”, line 275, in iterator
for row in self.query.results_iter():
File “/usr/lib/python2.5/site-packages/django/db/models/sql/query.py”, line 206, in results_iter
for rows in self.execute_sql(MULTI):
File “/usr/lib/python2.5/site-packages/django/db/models/sql/query.py”

尝试将数据库换成sqlite3,也是这个现象。google了一下,有人碰见过类似问题,但这个问题涉及的面太广,没有说出解决方案,只能靠自己了。准备第二天再来解决,关机休息。

第二天,机器重新启动之后,很奇怪,admin没有问题了。nginx首先自动启动,然后再手工启动fastcgi,前面好像顺序不对,不知道是不是这个理由。

分类: django, linux 标签:

python 下载 网站文档

2009年3月20日 roboter 没有评论

想下一个PIL的手册,PIL没有提供下载链接,就准备自己抓一把。发现一个python的工具

在python的Tools/webchecker目录下有一个工具websucker.py,直接如下执行:

python websucker.py http://www.pythonware.com/library/pil/handbook/index.htm
 
手册下来了,内容很完整,只是css和图片不见了。
 
完整的下载还是使用下面的wget工具,只是需要在linux下面。如果是windows,还需要下载一个windows版本的wget
网站下载工具 wget
分类: linux, python 标签:

python byte unicode

2009年2月21日 roboter 没有评论

word中,可以将doc文件转成mht文件,如果有汉字,则每个汉字转成unicode,再将unicode值转化成字符串进行保存,这样整个mht文件都是ascii编码。

wps也有这个转存mht的功能,只是将汉字转成utf8进行保存。这两种方式都没有什么可说的,但是word里面的公式是转成gif文件进行保存,而wps里面的公式是转成wmf格式,除了IE浏览器支持wmf外,其他的浏览器基本都不支持。而且在网络上针对gif的处理是很方便的,wmf处理起来相对麻烦一些。

为了转换unicode的ascii编码,了解一下byte string和unicode是很有必要的

python编码的概念:  http://315ok.org/boke/pythonbianmajieyi

word的ascii编码有一个值如下:

&#39064;

其中的39064 == 0×9898,这个byte string对应的汉字就是’题’

str = u’题’

str的byte string是’u9898′

现在就需要需要把一个数字编码 转换成Unicode,python提供了一个函数unichr(),ascii字符使用chr()函数。如果反过来转换,则可以使用ord().

 

收录了一下hex和byte string的转换公式,从这里http://code.activestate.com/recipes/510399/得来:

“”"
HexByteConversion

Convert a byte string to it’s hex representation for output or visa versa.

ByteToHex converts byte string “xFFxFEx00×01″ to the string “FF FE 00 01″
HexToByte converts string “FF FE 00 01″ to the byte string “xFFxFEx00×01″
“”"

#——————————————————————————-

def ByteToHex( byteStr ):
    “”"
    Convert a byte string to it’s hex string representation e.g. for output.
    “”"
    # Uses list comprehension which is a fractionally faster implementation than
    # the alternative, more readable, implementation below
    #  
    #    hex = []
    #    for aChar in byteStr:
    #        hex.append( “%02X ” % ord( aChar ) )
    #
    #    return ”.join( hex ).strip()       

    return ”.join( [ "%02X " % ord( x ) for x in byteStr ] ).strip()

#——————————————————————————-

def HexToByte( hexStr ):
    “”"
    Convert a string hex byte values into a byte string. The Hex Byte values may
    or may not be space separated.
    “”"
    # The list comprehension implementation is fractionally slower in this case   
    #
    #    hexStr = ”.join( hexStr.split(” “) )
    #    return ”.join( ["%c" % chr( int ( hexStr[i:i+2],16 ) )
    #                                   for i in range(0, len( hexStr ), 2) ] )
    bytes = []

    hexStr = ”.join( hexStr.split(” “) )

    for i in range(0, len(hexStr), 2):
        bytes.append( chr( int (hexStr[i:i+2], 16 ) ) )

    return ”.join( bytes )

#——————————————————————————-

# test data – different formats but equivalent data
__hexStr1  = “FFFFFF5F8121070C0000FFFFFFFF5F8129010B”
__hexStr2  = “FF FF FF 5F 81 21 07 0C 00 00 FF FF FF FF 5F 81 29 01 0B”
__byteStr = “xFFxFFxFFx5Fx81×21x07×0Cx00×00xFFxFFxFFxFFx5Fx81×29x01×0B”

if __name__ == “__main__”:
    print “nHex To Byte and Byte To Hex Conversion”

    print “Test 1 – ByteToHex – Passed: “, ByteToHex( __byteStr ) == __hexStr2
    print “Test 2 – HexToByte – Passed: “, HexToByte( __hexStr1 ) == __byteStr
    print “Test 3 – HexToByte – Passed: “, HexToByte( __hexStr2 ) == __byteStr

    # turn a non-space separated hex string into a space separated hex string!
    print “Test 4 – Combined  – Passed: “,
          ByteToHex( HexToByte( __hexStr1 ) ) == __hexStr2

分类: linux, python 标签:

python 读取ini文件

2008年10月21日 roboter 没有评论

python包含了一个ConfigParser模块,读取ini配置文件比较方便。以前一直都用它,最近希望使用ConfigParser打开utf8格式的配置文件,但是ConfigParser无法识别BOM的三个字符串。也就是不支持utf8。

google了一下,找到一个很方便的模块ConfigObj,它的读写全部基于unicode进行,所有内容形成一个字典。在存盘时,可以指定文件的编码方式。

http://www.voidspace.org.uk/python/configobj.html

示例如下:

fp = ConfigObj(inifile,encoding=’utf8′,default_encoding=’utf8′)

tags = fp['tag'] 

分类: linux, python 标签: