透明 发表于 2015-1-14 21:16:36

来谈谈:用python 来当设置文件

小知识:Linux主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。
毫无疑问,你必要设置文件。听说设置文件能让你的体系变得可定制。让体系变得可定制,有三年夜思潮,这决意了三种设置文件的格局:1.图形界面设置工具。微机和Windows入手下手盛行以后,我们的用户不再是黑客了,也许你的用户永久不会翻开你的设置文件,你必要给他一个图形工具,而且帮他换尿布。在人类永久不会浏览设置文件的情形下,让体系变得更简便的***就是利用呆板最简单了解的格局来存储设置,一般这是一个二进制文件。Pickle是Python中的典范选项。几十年后,有人入手下手觉得利用呆板和人都能了解(大概都不克不及了解)的格局是一个好主张,如许就有了XML。在这里,我只想告知人人:XML的确是好器材,可是在尽年夜多半情形下你实在其实不真的必要他。而在Zope/Plone中,设置被年夜范围地保留在ZODB数据库中。如许就发生了第一种设置文件范例,他是人类不成读的。2.惯例格局的设置文件,有出名的httpd.conf和INI等。基础上,INI很弱,并且INI的撑持库并没有供应诸如值考证乃至设置变量默许值的功效,因而,除非项目十分小你不该该利用INI格局。而在任什么时候候都不利用INI格局,有助于你养成优秀的习气。httpd.confLike的设置文件,是设置文件格局的顶峰之作。在Python中ZConfig(位于Zope2/Zope3中)供应了关于此种格局的撑持。我这里有一份进门简介:http://eishn.blog.163.com/blog/static/65231820069310828642/它只是进门先容,你必要浏览文档、源码大概典范才干完整懂得ZConfig的事情体例。只管其实不简单,可是了解ZConfig会匡助你疾速把握设置文件的计划哲学。惯例的设置文件计划息争析过于庞大,因而你能够仅作懂得。3.利用Python自己来作为设置文件。Whynot?今朝有很多C步伐正在利用Python作为设置文件,而Lighttpd的设置文件也已***不离十了。这里是一个例子:#demo_conf.py#设置文件host=127.0.0.1port=8080#demo.pyimportdemo_confprintdemo_conf.host,demo_conf.port使用Python剧本作为设置文件,在步伐完成上复杂,不必格局转换,并且功效壮大。这个计划已入手下手向传统的设置文件格局宣战。最初我修正了原定筹办先容ZConfig的企图,明天侧重来先容这个计划。上面,就让我们来计划本人的设置文件格局。要弄分明怎样计划一个设置文件,我们起首必要弄分明体系中有哪些数据范例是必要设置的,而且弄分明他们在多年夜水平上是能够设置的。依据履历,一个体系中能够定制的数占有三种:1."静态"数据,在C言语中,是用#define界说的。此类数据仅在开辟期具有静态性,一旦体系完成开辟,此类数据就是静态的。此类数据的变更频次最低。Python步伐员一般将变量名年夜写,而且放在"config.py"中,经由过程importconfig导进利用。2."默许"设置,这是项目设置部分最年夜的乱源。默许设置是一种用户能够在设置文件中修正的数据,他们不是必需的,他们有默许值。你很快就会发明很多"默许"设置实践上用户永久不会往修正他,在这类情形下,这些默许设置实践上是下面所说的"静态"数据,应当写进"config.py"。而另外一些则是经常使用设置,只是带有默许值罢了,这些数据应当写进"etc"设置文件中。不言而喻,一个变量不克不及同时存在于config.py和etc设置文件中。成绩在于弄分明一个变量是属于"静态"数据仍是"默许"设置是坚苦和不断定的。这终极招致你的设置文件界说朝令夕改,而你的项目则岌岌可危。3.设置项,毫无疑义地应当放在设置文件中。在体系投进利用后,这是变更频次最高的数据范例。在设置文件中,你又将面对另外一年夜应战,就是变量范例考证。变量范例考证之以是厌恶,就是由于你要同时判别一个设置变量是不是存在、范例是不是婚配大概是不是越界,而且是不是赐与默许值。最初最糟的是你还必要回覆一个成绩:默许值是不是必要写在设置文件中。为懂得决一切这些成绩,人们创造了Schema。和传统设置文件分歧,利用Python作为设置文件,Schema的编写具有相称年夜的天真性。并且Schema能匡助你把Python格局的设置文件变得加倍可读。上面我就演示一下在Python作为设置文件格局时Schema的写法。#/PATH/TO/ETC/demo_conf.py#设置文件importschemaServer(host=127.0.0.1,port=8080)#-EOF-#/PATH/TO/ETC/schema.py#config={}defServer(**args):config=args.get(host,0.0.0.0)#有默许值try:config=int(args.get(port,8080))#带考证exceptValueError:raiseValueError,你必需是整型#-EOF-#/PATH/TO/BIN/demo.py#importsyssys.path.append(r/PATH/TO/ETC)importschema,demo_confprintschema.config,schema.config#-EOF-好了,接上去我们必要把demo_conf.py变得更像一个设置文件,由于"importschema"不像是一个设置文件中应当有的器材,我们要让"Server"成为预导进的变量。最初,我们还要把demo_conf.py酿成demo.conf。如许继PyQt4一招鲜以后,我们又要再次打仗到自界说导进手艺。此次我们将利用相似的手艺,也是一个导进钩子(hook),分歧的是,此次我们不将钩子挂接到Python注释器。###################################################################-BOF-#pyetc.py#Python格局的设置文件撑持库#importsys,os.pathModule=type(sys)#故伎重演modules={}#缓存已导进的etc(设置)模块#导进恣意切合Python语法的文件#用法:#module=pyetc.load(完全文件路径并包括扩大名,预载进变量,自界说前往模块范例)#defload(fullpath,env={},module=Module):try:code=open(fullpath).read()exceptIOError:raiseImportError,Nomodulenamed%s%fullpathfilename=os.path.basename(fullpath)try:returnmodulesexceptKeyError:passm=module(filename)m.__module_class__=modulem.__file__=fullpathm.__dict__.update(env)execcompile(code,filename,exec)inm.__dict__modules=mreturnm#移除已导进的模块#用法:#module=unload(module)#defunload(m):filename=os.path.basename(m.__file__)delmodulesreturnNone#从头导进模块#用法:#module=pyetc.reload(module)#defreload(m):fullpath=m.__file__try:code=open(fullpath).read()exceptIOError:raiseImportError,Nomodulenamed%s%fullpathenv=m.__dict__module_class=m.__module_class__filename=os.path.basename(fullpath)m=module_class(filename)m.__file__=fullpathm.__dict__.update(env)m.__module_class__=module_classexeccompile(code,filename,exec)inm.__dict__modules=mreturnm###################################################################-EOF-上面就让我们来实验一下。#/PATH/TO/ETC/demo.conf#设置文件host=127.0.0.1port=8080#-EOF-#demo.pyimportpyetcconf=pyetc.load(r/PATH/TO/ETC/demo.conf)printconf.host,conf.port#-EOF-最初是一个较为完全的例子:#/PATH/TO/ETC/demo.conf#办事器选项#Server(port=8080#监听8080端口)#历程把持器选项#Daemon(#利用Socket公布历程把持器#address=(0.0.0.0,10080),#利用文件公布历程把持器address=var(demo.pid),#办事器历程program=bin(server.py),#调试开关verbose=True)#-EOF-#/PATH/TO/BIN/schema.py#路径工具importsys,os.pathDEMO_HOME=r/PATH/TO/DEMOETC=lambdafilename:os.path.join(DEMO_HOME,etc,filename)VAR=lambdafilename:os.path.join(DEMO_HOME,var,filename)BIN=lambdafilename:os.path.join(DEMO_HOME,bin,filename)#classConfig(dict):#能够像属性一样会见字典的Key#dict.key同等于dictdef__getattr__(self,name):returnself#设置默许值config=Config({server:Config({port:8080#办事器利用8080端口}),daemon:Config({address:VAR(daemon.pid),#pid文件program:BIN(server.py),#办事器步伐verbose:True})})#设置接口(不带考证)defServer(**args):config.update(args)defDaemon(**args):config.update(args)#设置文件"demo.conf"可见的变量env={Server:Server,Daemon:Daemon,etc:ETC,var:VAR,bin:BIN}#-EOF-#/PATH/TO/BIN/demo.py#这里启动一个Daemon办理器,#注重:这里的daemon.py是一个设想库,不必剖析importpyetcfromdaemonimportDaemondefstart():#读取设置文件#demo.confpyetc.load(schema.ETC(demo.conf),env=schema.env)conf=schema.config.daemon#创立Daemon工具daemon=Daemon(address=conf.address,#历程把持器地点/pid文件地位program=conf.program,#背景历程步伐地位verbose=conf.verbose#调试)print历程办理器已启动daemon()if__name__==__main__:start()#-EOF-from:http://eishn.blog.163.com/blog/static/6523182007236721876/

小知识:Linux发展和成长过程始终依赖着五个重要支柱:UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。

变相怪杰 发表于 2015-1-17 09:10:36

在学习的过程中,我们用的是VM虚拟机,开始时真的不真的该怎么去做,特别是我的是命令窗口界面,别人的是图形界面,我都不知道怎么调过来。

因胸联盟 发表于 2015-1-25 10:22:34

得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。

简单生活 发表于 2015-2-2 21:59:30

目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。

爱飞 发表于 2015-2-25 15:29:09

学习Linux应具备的。[书籍+网络资源]

小妖女 发表于 2015-3-8 00:49:17

另外Linux上也有很多的应用软件,安装运行了这些软件后,你就可以在Linux上编辑文档、图?片,玩游戏、上网、播放多媒体文件等。

谁可相欹 发表于 2015-3-15 22:43:11

一些显而易见的小错误还是用vi改正比较方便。以后的大一点的程序就得在Linux下调试了,因为有的头文件在VC里面说找不到。?

深爱那片海 发表于 2015-3-22 18:09:30

首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
页: [1]
查看完整版本: 来谈谈:用python 来当设置文件