关于perl的readhash与python的pickle

已查看 8 次
跳至第一个未读帖子

GunsNRose

未读,
2008年7月29日 23:45:092008/7/29
收件人 python-cn`CPyUG`华蟒用户组
前段时间在看ipcop的perl cgi的时候看到
&General::readhash("${General::swroot}/ethernet/settings", \
%netsettings);
很方便的使用里面的东西了,我首先想到的是python里的,pickle,结果保存字典后的数据,用文本方式打开,根本不是
HOSTNAME=myhome 这种格式的
然后我就想到一个办法是 eval $(read_pickle.py ./my.conf) 的方法来引用变量,
read_pickle.py
也就是把load my.conf然后把字典以 xxx=xxx方式显示出来,让eval() 将其转化为shell可用的变量形式, echo
"hostname=${HOSTNAME}"

不知各位有什么更好的办法,最好能达到像perl的readhash那样,用文本直接打开就可以了,
好比bash的 source ./my.conf ,只是加了 readhas 下面这个脚本是安全保险
#=====================================
以下是一个单独脚本供给bash shell读取perl存的hash数据

#使用方法 eval $(readhash /var/ipcop/main/settings)

# shell variables must consist of alphanumeric characters and
underscores,
# and begin with an alphabetic character or underscore.
VARNAME='[A-Za-z_][A-zA-z0-9_]*'

# For the assigned value we only accept a limited number of characters
- none
# of which are shell metachars
VARCHARS='A-Za-z0-9=/,._@#+-'
VARVAL="[${VARCHARS}]*"

sed -ne "s/^\(${VARNAME}\)=\(${VARVAL}\)$/\1=\2/p" $1
#=====================================

samson

未读,
2008年7月30日 04:16:082008/7/30
收件人 python-cn`CPyUG`华蟒用户组
pickle是把对象序列化方式保存,反向读出来形成对象就可以了,为什么要关心保存的文本呢?

Jiahua Huang

未读,
2008年7月30日 04:47:432008/7/30
收件人 pyth...@googlegroups.com
2008/7/30 GunsNRose <zlb...@gmail.com>:

> 前段时间在看ipcop的perl cgi的时候看到
> &General::readhash("${General::swroot}/ethernet/settings", \
> %netsettings);
> 很方便的使用里面的东西了,我首先想到的是python里的,pickle,结果保存字典后的数据,用文本方式打开,根本不是
> HOSTNAME=myhome 这种格式的

只是要倾倒出来,那何必一定要人眼可读的"文本",
pickle.dumps() 出来的东西也是文本,不过是 python 的 pickle 格式而已,
可以用 pickle.loads() 读入

并且pickle 其实也是人眼可读的,
她其实是个基于栈的语言,看 /usr/lib/python2.5/pickle.py 就知道了

> 然后我就想到一个办法是 eval $(read_pickle.py ./my.conf) 的方法来引用变量,

这样太 XX 了,
如果死也要 xxxx=yyyy 那样的格式,
那么就用 ini file 一类模块好了

yuting cui

未读,
2008年7月30日 05:01:052008/7/30
收件人 pyth...@googlegroups.com
2008/7/30 GunsNRose <zlb...@gmail.com>:

> 前段时间在看ipcop的perl cgi的时候看到
> &General::readhash("${General::swroot}/ethernet/settings", \
> %netsettings);

c=ConfigParser.ConfigParser()
c.readfp(open(...))
c.write(open(...))

GunsNRose

未读,
2008年7月30日 08:40:452008/7/30
收件人 python-cn`CPyUG`华蟒用户组


On 7月30日, 下午5时01分, "yuting cui" <yuting...@gmail.com> wrote:
多谢,我先看看ConfigParser 这个模块,至于为什么要关心保存的内容,贴子已说明了,还有一点是我贴子里的方法就能用了,只是看到perl
这种现成的,相信python中也有,初学python,看看有没有像perl这么简单的方案

GunsNRose

未读,
2008年7月30日 08:49:272008/7/30
收件人 python-cn`CPyUG`华蟒用户组
我的目的是想让python设置的信息在bash的脚本中可以很方便读出来使用
例比设置IP地址, IPADDR=192.168.1.8 ,至于在 /etc/rc.d/里面换用python来代替bash脚本这种方式我个人暂
时还不认同,刚看了一下ConfigParser基本能达到要求,不知兄台有什么高招请指点

scaner

未读,
2008年7月30日 09:55:172008/7/30
收件人 python-cn`CPyUG`华蟒用户组
> 我的目的是想让python设置的信息在bash的脚本中可以很方便读出来使用
> 例比设置IP地址, IPADDR=192.168.1.8 ,至于在 /etc/rc.d/里面换用python来代替bash脚本这种方式我个人暂
> 时还不认同,刚看了一下ConfigParser基本能达到要求,不知兄台有什么高招请指点

看楼主的意思,配置应该都是简单的明面字典,结构不复杂,
没有层级树状结构。
如果是这样,python也就是三两句话啊

def dump_config(fn, dict):
fout = file(fn, 'wb')
for k, v in dict.items():
fout.write('%s=%s\n' % (k, v))
fout.close()

如果有层次关系, 那就稍微复杂一点, k可能还要表达层次关系.

GunsNRose

未读,
2008年7月30日 10:40:052008/7/30
收件人 python-cn`CPyUG`华蟒用户组
多谢,这个方法很好,只是我还没想到python的读取, 先收下先,
我是打算这样的, python写个简单的CGI来实现WEB配置,如果不考虑给shell使用的话,cPickle很适合,不过我还要在
自己的/etc/rc.d/的脚本里面读出WEB配置保存的参数进行相应的设置,而这种格式使用 xxx=xx方式非常简单有效,我不考虑多层结构,
因为多层处理的话shell脚本调用也不方便

Jiahua Huang

未读,
2008年7月30日 10:46:202008/7/30
收件人 pyth...@googlegroups.com
2008/7/30 GunsNRose <zlb...@gmail.com>:

> 多谢,这个方法很好,只是我还没想到python的读取, 先收下先,
> 我是打算这样的, python写个简单的CGI来实现WEB配置,如果不考虑给shell使用的话,cPickle很适合,不过我还要在
> 自己的/etc/rc.d/的脚本里面读出WEB配置保存的参数进行相应的设置,而这种格式使用 xxx=xx方式非常简单有效,我不考虑多层结构,
> 因为多层处理的话shell脚本调用也不方便
>

/etc/rc.d/ 的脚本也可以是 python script 的,
另外, /etc/rc.d/ 启动脚本通常不读取解析配置文件,而是由她启动的程序来处理

GunsNRose

未读,
2008年7月30日 21:34:532008/7/30
收件人 python-cn`CPyUG`华蟒用户组
嗯,是这样的,不过/etc/rc.d下的脚本全是自己用bash写的,本意就是想用bash shell来写,不想粘其他语言上去
scaner 兄台的python存后,读取方法我暂时想到用re 来解决,可能方法比较笨
回复全部
回复作者
转发
0 个新帖子