(np2r) ========================================================================================== 1.安装python到D:\progxp\Python 2.复制python安装目录内msvcr71.dll到system32,复制python24.dll到Apache2\bin 3.安装mod_python 4.设置一个环境变量PYTHONHOME="D:\progxp\Python"(需要重启系统) 5.在apache的httpd.conf添加: LoadModule python_module modules/mod_python.so ... AddHandler mod_python .psp .psp_ #测试服务器里才用.psp_ PythonHandler mod_python.psp #这里必须这么写 PythonDebug On #测试服务器里才On ... DirectoryIndex index.psp index.php index.htm ... NameVirtualHost 127.0.0.1:80 <VirtualHost 127.0.0.1:80> ServerName psp.diy DocumentRoot E:\www\PSPApps\ROOT </VirtualHost> 6.重启Apache,在index.psp里用<%='hell'%>测试一下 注意:mod_python并没有类似php的open_basedir,不能做互相隔离的虚拟web服务器 ========================================================================================== 与python的print不同,mod_python用req.write输出内容到网页: req.write(str(345)) #str()函数可以用反引号来代替:`aArr`,`aInt`等等 <%=345<br>%> #该方法会自动用str()预处理输出内容,不管输出内容是否字串 ========================================================================================== 1."#"是单行注释符(而非"//"): #$str='jack' 遗憾的是目前python没有多行注释或内嵌注释(内嵌注释更重要,像php里:echo /*kk*/'hell';暂时可用"#...\<换行>"代替) 2.";"是断行符: sum=3+4;req.write(str(sum)+'<br>') 3."\"是续行符: aDict={'a':'jack',\ 'b':1982,\ '1':'hell'\ } req.write(str(sum)+'<br>') 4.函数块/对象块: def myfun(x,y):sum=x+y;return str(sum) 或: def myfun(x,y): 'sum x and y' #单行文档,本质是个单行字串常量,要注意缩进对齐(放在外面对齐后可以假装注释,不能用于代码后注释) '''sum #多行文档,本质是个多行字串常量,首行要注意缩进对齐(放在外面对齐后可以假装注释,不能用于代码后注释) x and y ''' sum=x+y return str(sum) class myClass: 'my very first class' version = 0.1 注意只能同块缩进,并且缩进格数都要相同 由于不需要{}来区分块了,有条件将块名露出一个字节来了,定为惯例 ========================================================================================== 创建空对象: class aClass:pass aObject=aClass() aObject.age=13 ========================================================================================== python是动态类型定义的(初次赋值时确定类型,跟php类似) 同时也是强制类型定义的(这点比php好),不会自动进行类型转换,必须人工类型转换: int(),long(),float(),str(),tuple() ========================================================================================== python里的所有赋值都是传址, 有点像js, 要传值可以先作空运算再赋值 接龙赋值:a=b=10 #最好不用,容易与"a=(b=10)"混淆 编队赋值:x,y,z=5,4,3 #最好不用,如果x/y/z关系真的很紧密,将它们组成词典型更符合人类逻辑 ========================================================================================== Dynamic Programming Language(动态语言或动态编程语言) Dynamically Typed Language(动态类型语言) Statically Typed Language(静态类型语言) 动态语言是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化, JavaScript\Ruby\Python等都属于动态语言,而C\java等语言则不属于动态语言,动态语言一般也都是动态类型语言 ========================================================================================== 注意python的long型只跟存储器容量(硬盘)有关,可以认为是无限,这与其它语言的有限long不同(无限太酷了,不过一般不必用) ========================================================================================== str型(字串str)可以用单引号或双引号,不同于php的是python多行字串要用三引号('''或""",用转义符\n比较麻烦), (推荐用单引号,但不同于php在python下单引号内转义符生效), 字串可以认为是特种tuple 字串取元和切片(皆只读): aStr='Python' aStr[0]=='P' aStr[-1]=='n' aStr[1:3]=='yt' aStr[n:m]==''(n>=m时) aStr[1:]==aStr[1:None]=='ython' #None可以用来切片(可用隐式写法)但不能用来取元 aStr[:3]=='Pyt' aStr[:-2]=='Pyth' +号用来连接字串:aStr+bStr *号用来重复字串:aStr*n ========================================================================================== list型和tuple型(发音/tju:pl/,源自n-tuple:n倍体,n维体): list型(列单型)像是php数字索引数组 tuple型(元组型或枚列型)像是只读单列型,像mysql里的enum枚举型,不是特别需要只读的时候推荐都用list型 列单型和枚列型都像字串型一样取元和切片,其中列单型的取元和切片都可以赋值: aList=['a',123,'jack',456,aStr] aList[1]='helloworld' aList[1:3]=['helloworld',1234] aList[3:None]=['helloworld',1234] #None可以用来切片(可用隐式写法)但不能用来取元 aList[1:3]='helloworld' #把字串tuple的前两元'h','e'赋给了aList[1]和aList[2],tuple赋值给list倒是不用转型 aList[1:3]=('hello','hell') #tuple赋值给list倒是不用转型,不用写成list:['hello','hell'] aList.append('peter') #附加元素 ========================================================================================== None被算作字串,但None和空串''不是一个概念 python的函数返回的对象可以直接用(遗憾php不行):aStr='a,b,c';req.write(aStr.split(',')[1]) ========================================================================================== dictionary型(词典型)像是php的字串索引数组(但次序不被控制),严格要求必须有索引且为字串: (str,list,tuple都是sequence型(序列型),而词典型不是,它有着奇怪的次序: 1,0,3,2,5,4,7,6,9,8,A,<同小写>,Z,a,c,b,e,d,g,f,i,h,k,j,m,l,o,n,q,p,s,r,u,t,w,v,y,x,z 如果需要key-value对的序列,想到用list来构造:[['a','A'],['b','B'],...], 但是要对索引排序时很麻烦,而dictionary型可以用dict_keys=aDict.keys();dict_keys.sort()排序, 所以在这种需要下还是另用一个list来记录dictionary的key的原始次序 ) aDict={'host':'earth', 'port':80} aDict['host']='earth' aDict['']='moon' aDict[None]='sun' #None在这里不能采用隐式写法 aDict.keys()以list返回所有键 aDict.values()以list返回所有值 ========================================================================================== python中没有常量const概念, 因为解释型语言无所谓编译时替换常量, 可以自己实现不可二次赋值的只读变量或对象属性: # const.py: class _const: def __setattr__(self,name,value): if self.__dict__.has_key(name): raise TypeError,"Can't rebind %s.%s"%(self.__class__.__name__,name) self.__dict__[name]=value import sys sys.modules[__name__]=_const() #不import的话不要上两行, 直接: const=_const() # test.py import const const.MAGIC=23 const.MAGIC=88 print const.MAGIC #一般为了性能不用这么做, 只要变量名全大写就可以了 ========================================================================================== 运算符: **是乘方号:2**3==8(而php中是用函数pow(2,3)) 不等号推荐用!= 并没有++n,n--(太好了,早看不惯这个东东) ========================================================================================== 接龙比较:3<4<7 # same as: (3<4) and (4<7) ========================================================================================== python不支持switch,而统一采用if-elif-...-else(因为switch的执行过程就是if-else): if x==1: req.write('a') elif x==2: #注意:elseif缩成了elif req.write('b') elif x==3: req.write('c') else : req.write('d') 因为有严格的缩进控制,即使使用if-else嵌套也不会造成混淆: if x==1: req.write('a') if x==2: req.write('b') else : if x==3: req.write('d') ========================================================================================== while循环: counter=0 while counter<5: req.write(str(counter)+'<br>') counter=counter+1 ========================================================================================== for遍历: (类似c的for循环被放弃了(这种应该用while),python里的for遍历类似php的foreach, 但限定为单遍历变量,遍历域可以是list也可以是tuple) 1.计数循环: for i in range(6): #range(n)函数产生list(0到n-1整数列) req.write(str(i)+'<br>') 2.词典遍历: aDict={'b':'jack',\ 'a':1982,\ '1':'hell'\ } ord_dict=['b','a','1'] #保存aDict的key的原始次序 for key in ord_dict: req.write(str(aDict[key])+'<br>') ========================================================================================== 文件操作: (跟php类似,除了没有file_get_contents和file两个函数(可用open('...','r+').read(),open('...','r+').readlines()), 而且不能直接读取web文件,还有psp运行的当前路径不在该psp所在文件夹而在apache内(据说是因为mod_python只是python的 转译器,而python是多线程的,同一运行文件没有确定current working directory),因而open函数不方便使用相对路径(见'取 得当前psp所在文件夹'),而这点也许正好可以避免多重文件包含时相对路径冲突 ********尚不知道怎么约束mod_python的文件访问在一个windows系统上的一定范围内*********** ) 1.读操作: fh=open('E:\www\PHPApps\LOCAL\index.php','r+') #第二个参数留空时代表'r',新建文件时用'w+',binary操作时用'rb+' aLine=fh.readline() #读取当前行到str,含换行符 leftLines=fh.readlines() #读取当前行后所有行(含换行符)到list(并无参数指定读取行数) leftContent=fh.read(num_after) #读取当前字节后参数个字节(-1或负数或留空代表剩余所有)到str fh.seek(0,0) #指向相对于文件头(第二参数0:头,1:现,2:尾)0字偏移位置 fh.tell() #取得当前文件指针位置 fh.close() 行定位函数: def seek_ln(fh, start) fh.seek(0,0) for i in range(start) fh.readline() 2.写操作: fh.truncate(num_left) #将文件截尾剩参数个字节(留空代表剩余0) fh.write(str) #将参数字串从文件当前指针处开始覆写,虽写操作还有writelines方法,但因换行不同建议不使用 ========================================================================================== 取得当前psp所在文件夹: req.write(os.getcwd()+'<br>') #得到D:\progxp\Apache Group\Apache2 req.write(os.path.dirname(__file__)+'<br>') #D:\progxp\Python24\lib\site-packages\mod_python req.write(os.path.dirname(req.filename)+'<br>') #得到E:/www/PHPApps/LOCAL/test,这才是当前psp所在文件夹 req.write(req.document_root()+'<br>') #得到web服务根目录:E:/www/PHPApps/LOCAL ========================================================================================== 捕获错误: (根据不同错误作处理,无错误则无需处理,还有try-finally似乎不需要,可以在try-except-else过后写必须执行的代码): try: ... retval=float(object) except IOError: retval='could not read file' except (ValueError, TypeError): retval='object type cannot be converted to float' except Exception, diag: retval=str(diag) else: retval='great' ========================================================================================== 枚列一个module内所有class的名字: import pyclbr moduletobrowse = pyclbr.readmodule("file_base_name") #比如test.py就只输入test for i in moduletobrowse.items(): print i[0] ==========================================================================================