白菜粉条汤
make life remembered
  • 首页
  • 分类
    • 随语
    • 杂志
    • 外贸
    • 技术
    • 图片
    • 电影
    • 音乐
    • 饮食
    • 大学
  • 关于
每月存档

5月 2009

技术

Python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import

by 曾经沧海 2009年5月31日

模块的搜索路径

模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的加入(sys.path.apend)即可。下面是sys.path在Windows平台下的添加规则。

1、sys.path第一个路径往往是主模块所在的目录。在交互环境下添加一个空项,它对应当前目录。

2、如果PYTHONPATH环境变量存在,sys.path会加载此变量指定的目录。

3、我们尝试找到Python Home,如果设置了PYTHONHOME环境变量,我们认为这就是Python Home,否则,我们使用python.exe所在目录找到lib\os.py去推断Python Home。

如果我们确实找到了Python Home,则相关的子目录(Lib、plat-win、lib-tk等)将以Python Home为基础加入到sys.path,并导入(执行)lib/site.py,将site-specific目录及其下的包加入。

如果我们没有找到Python Home,则把注册表Software\Python\PythonCore\2.5\PythonPath的项加入sys.path(HKLM和 HKCU合并后加入),但相关的子目录不会自动添加的。

4、如果我们没有找到Python Home,并且没有PYTHONPATH环境变量,并且不能在注册表中找到PythonPath,那么缺省相对路径将加入(如:.\Lib;.\plat-win等)。

总结如下

当在安装好的主目录中运行Python.exe时,首先推断Python Home,如果找到了PythonHome,注册表中的PythonPath将被忽略;否则将注册表的PythonPath加入。

如果PYTHONPATH环境变量存在,sys.path肯定会加载此变量指定的目录。

如果Python.exe在另外的一个目录下(不同的目录,比如通过COM嵌入到其他程序),Python Home将不推断,此时注册表的PythonPath将被使用。

如果Python.exe不能发现他的主目录(PythonHome),并且注册表也没有PythonPath,则将加入缺省的相对目录。

标准Import

Python中所有加载到内存的模块都放在sys.modules。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。如果没有加载则从sys.path目录中按照模块名称查找模块文件,模块文件可以是py、pyc、pyd,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的Local名字空间。

可以看出了,一个模块不会重复载入。多个不同的模块都可以用import引入同一个模块到自己的Local名字空间,其实背后的PyModuleObject对象只有一个。

说一个容易忽略的问题,import只能导入模块,不能导入模块中的对象(类、函数、变量等)。如一个模块A(A.py)中有个函数getName,另一个模块不能通过import A.getName将getName导入到本模块,只能用import A。如果想只导入特定的类、函数、变量则用from A import getName即可。

嵌套Import

嵌套import,我分两种情况,一种是:本模块导入A模块(import A),而A中又有import语句,会激活另一个import动作,如import B,而B模块又可以import其他模块,一直下去。

对这种嵌套比较容易理解,注意一点就是各个模块的Local名字空间是独立的,所以上面的例子,本模块import A完了后本模块只能访问模块A,不能访问B及其他模块。虽然模块B已经加载到内存了,如果要访问还要在明确的在本模块中import B。

另外一种嵌套指,在模块A中import B,而在模块B中import A。这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释,抄录如下:

[A.py] from B import D class C:pass [B.py] from A import C class D:pass

为什么执行A的时候不能加载D呢?

如果将A.py改为:import B就可以了。

这是怎么回事呢?

RobertChen:这跟Python内部import的机制是有关的,具体到from B import D,Python内部会分成几个步骤:

  1. 在sys.modules中查找符号"B"
  2. 果符号B存在,则获得符号B对应的module对象<module B>。

    从<module B>的__dict__中获得符号"D"对应的对象,如果"D"不存在,则抛出异常

  3. 如果符号B不存在,则创建一个新的module对象<module B>,注意,这时,module对象的__dict__为空。执行B.py中的表达式,填充<module B>的__dict__ 。

    从<module B>的__dict__中获得"D"对应的对象,如果"D"不存在,则抛出异常。

所以,这个例子的执行顺序如下:

1、执行A.py中的from B import D

由于是执行的python A.py,所以在sys.modules中并没有<module B>存在,首先为B.py创建一个module对象(<module B>),注意,这时创建的这个module对象是空的,里边啥也没有,在Python内部创建了这个module对象之后,就会解析执行B.py,其目的是填充<module B>这个dict。

2、执行B.py中的from A import C

在执行B.py的过程中,会碰到这一句,首先检查sys.modules这个module缓存中是否已经存在<module A>了,由于这时缓存还没有缓存<module A>,所以类似的,Python内部会为A.py创建一个module对象(<module A>),然后,同样地,执行A.py中的语句。

3、再次执行A.py中的from B import D

这时,由于在第1步时,创建的<module B>对象已经缓存在了sys.modules中,所以直接就得到了<module B>,但是,注意,从整个过程来看,我们知道,这时<module B>还是一个空的对象,里面啥也没有,所以从这个module中获得符号"D"的操作就会抛出异常。如果这里只是import B,由于"B"这个符号在sys.modules中已经存在,所以是不会抛出异常的。

上面的解释已经由Zoom.Quiet收录在啄木鸟了,里面有图,可以参考一下。

Package(包) Import

包(Package)可以看成模块的集合,只要一个文件夹下面有个__init__.py文件,那么这个文件夹就可以看做是一个包。包下面的文件夹还可以成为包(子包)。更进一步,多个较小的包可以聚合成一个较大的包,通过包这种结构,方便了类的管理和维护,也方便了用户的使用。比如SQLAlchemy等都是以包的形式发布给用户的。

包和模块其实是很类似的东西,如果查看包的类型import SQLAlchemy type(SQLAlchemy),可以看到其实也是<type ‘module’>。import包的时候查找的路径也是sys.path。

包导入的过程和模块的基本一致,只是导入包的时候会执行此包目录下的__init__.py而不是模块里面的语句了。另外,如果只是单纯的导入包,而包的__init__.py中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。如:

PA

–__init__.py

–wave.py

–PB1

  –__init__.py

  –pb1_m.py

–PB2

  –__init__.py

  –pb2_m.py

__init__.py都为空,如果有以下程序:

  1. import sys
  2. import PA.wave  #1
  3. import PA.PB1   #2
  4. import PA.PB1.pb1_m as m1  #3
  5. import PA.PB2.pb2_m #4
  6. PA.wave.getName() #5
  7. m1.getName() #6
  8. PA.PB2.pb2_m.getName() #7

当执行#1后,sys.modules会同时存在PA、PA.wave两个模块,此时可以调用PA.wave的任何类或函数了。但不能调用PA.PB1(2)下的任何模块。当前Local中有了PA名字。

当执行#2后,只是将PA.PB1载入内存,sys.modules中会有PA、PA.wave、PA.PB1三个模块,但是PA.PB1下的任何模块都没有自动载入内存,此时如果直接执行PA.PB1.pb1_m.getName()则会出错,因为PA.PB1中并没有pb1_m。当前Local中还是只有PA名字,并没有PA.PB1名字。

当执行#3后,会将PA.PB1下的pb1_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m四个模块,此时可以执行PA.PB1.pb1_m.getName()了。由于使用了as,当前Local中除了PA名字,另外添加了m1作为PA.PB1.pb1_m的别名。

当执行#4后,会将PA.PB2、PA.PB2.pb2_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m、PA.PB2、PA.PB2.pb2_m六个模块。当前Local中还是只有PA、m1。

下面的#5,#6,#7都是可以正确运行的。

注意的是:如果PA.PB2.pb2_m想导入PA.PB1.pb1_m、PA.wave是可以直接成功的。最好是采用明确的导入路径,对于./..相对导入路径还是不推荐用。

2009年5月31日 0 评论 427 阅读
技术

在Windows上安装Python+MySQL 的常见问题及解决方法

by 曾经沧海 2009年5月28日

验证是否已经安装了MySQLdb:

==========================================================
d:\usr\local\Python25>python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] onwin32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
ImportError: No module named MySQLdb
==========================================================
如果有类似于上面的”No module named MySQLdb”,表明MySQLdb尚未安装或安装的不成功!

MySQL 版本:5.0.67
下载地址:http://dev.mysql.com/downloads/mysql/5.0.html#downloads
下载exe文件并安装

==========================================================

Python 版本:2.5
下载地址:http://www.python.org/download/releases/2.5.4/
下载msi文件并安装

MySQLdb版本: MySQLdb Windows binary for Python 2.5
下载地址:http://biohackers.net/wikiattach/Python2(2e)5/attachments/MySQL-python.exe-1.2.1_p2.win32-py2.5.exe
参见:http://forums.mysql.com/read.php?50,129618,140611#msg-140611

常见问题:
1.无法定位程序输入点 mysql_server_init 于动态链接库 LIBMYSQL.dll 上。
—————————————————————————————————-
D:\usr\local\Python25>python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “D:\usr\local\Python25\Lib\site-packages\MySQLdb\__init__.py”, line 19, in <module>
    import _mysql
ImportError: DLL load failed: 找不到指定的程序。
—————————————————————————————————-
解决方法:把mysql安装目录的bin\libmySQL.dll文件复制到python安装目录的Lib\site-packages下

==========================================================

Python 版本:2.6
下载地址:http://www.python.org/download/releases/2.6.1/
下载msi文件并安装

MySQLdb版本: MySQL-python-1.2.2.win32-py2.6.exe
下载地址:http://home.netimperia.com/files/misc/MySQL-python-1.2.2.win32-py2.6.exe
参见:http://sourceforge.net/forum/forum.php?thread_id=2316047&forum_id=70460

常见问题:
1.ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
D:\usr\local\Python26>python
Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “D:\usr\local\Python26\Lib\site-packages\MySQLdb\__init__.py”, line 19, in <module>

    import _mysql
ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
解决方法:下载libmmd.dll(附件)和libguide40.dll(附件)两个dll文件并复制到python安装目录的Lib\site-packages下。
参见:http://sourceforge.net/forum/message.php?msg_id=5613887

2.ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
D:\usr\local\Python26>python
Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
D:\usr\local\Python26\lib\site-packages\MySQLdb\__init__.py:34: DeprecationWarning: the sets module is deprecated
  from sets import ImmutableSet
—————————————————————————————————-
解决方法:
1) file “__init__”, replace: 
 
from sets import ImmutableSet  
class DBAPISet(ImmutableSet):  
 
with  
 
class DBAPISet(frozenset) 
 
2) file “converters.py”, remove: 
 
from sets import BaseSet, Set 
 
3) file “converters.py”, change “Set” by “set” (IMPORTANT: only two places): 
 
line 48: return set([ i for i in s.split(‘,’) if i ]) 
line 128: set: Set2Str, 
参见:http://sourceforge.net/forum/message.php?msg_id=5808948

相关附件

2009年5月28日 0 评论 380 阅读
技术

安装Diango出现的小问题

by 曾经沧海 2009年5月24日

我的是vista,在按照网上的教程安装django后,使用django-admin.py startproject newtest命令运行一直不成功:会直接把django-admin.py文件的内容显示出来。

在前面加个 python, 会提示找不到文件django-admin.py。于是,我在命令行下进入C:\Python26\Scripts, 再运行python django-admin.py startproject newtest,就会看到一个新的文件夹newtest出现,应该是这样了。

我的工作目录想设施为d:\django,于是,我将django-admin.py复制到d:\django,命令行下进入d:\django,运行python django-admin.py startproject newtest,这时候就成功了。

不知道为什么会这样,网上的文章都是说直接用“django-admin.py startproject newtest”就可以运行,而且好像是说任意目录都可以运行,也许只有我自己的电脑是这样?我的系统是vista home版本。

2009年5月24日 0 评论 347 阅读
技术

python程序练习–简单电话薄

by 曾经沧海 2009年5月18日

python程序练习–简单电话薄代码

#python程序练习–简单电话薄 
#樊海军 
#fanhaijun.com 
#Python 2.6.2 

import cPickle as p 
import string 
class phonebook: 
        def __init__(self): 
                pblist=[] 

def pb_add(): 
        #print "This is the ADD function" 
        while 1: 
                print ‘\nPlease input a NEW name["Q" to back to main menu]:\n’ 
                add_name=raw_input("Name:") 

                if add_name=="Q": 
                        main() 
                else: 
                        add_sex=raw_input("Sex:") 
                        add_tel=raw_input("Tel:")                       
                pbdict={"Name":add_name,"Sex":add_sex,"Tel":add_tel}            
                print "You just input:" 
                for i in pbdict.items(): 
                        print ("%s:%-5s  ") % (i[0],i[1]), 

                pb.pblist.append(pbdict) 
                del pbdict 
             print ("\nRecord added sucessfully! Continue?(Y/N)\n")              
        while 1: 
                       con=raw_input() 
            if con=="Y": 
                            pb_add() 
                    elif  con=="N": 
                            pb_save() 
                            main() 
            else: 
                print ("\nError! Continue?(Y/N)\n") 

def pb_browser(): 
        #print "This is the BROWSER function" 
        #print pb.pblist 

        print "\nThere are %s records:\n"% len(pb.pblist) 
        print "*******************************************" 
        print "  ID     NAME     SEX      TEL" 
        print "*******************************************" 
    for i in pb.pblist: 
               #print "===========================================" 
                print "%3s     " % (pb.pblist.index(i)+1), 
                print "%-8s" % i["Name"], 
                print "%-8s" % i["Sex"], 
                print "%-8s" % i["Tel"] 
            print "===========================================" 
        main()  

def pb_del(): 
        #print "This is the DEL function" 

        while 1: 
                print "\nPlease input the ID of the record you want to delete:[Input 0 to main menu]\n" 
                del_id=raw_input() 
                if int(del_id)==0: 
                        main() 
                elif del_id=="" or int(del_id)<0 or int(del_id)>len(pb.pblist): 
                        #print "\nPlease input a RIGHT ID :\n"   
                        continue 

                elif int(del_id)<=len(pb.pblist) and int(del_id)>0: 
                        del pb.pblist[int(del_id)-1] 
            pb_save() 

def pb_search(): 
        #print "This is the SEARCH function" 

    while 1: 
        print "Please input what ever you want to search:" 
        s=str(raw_input()).lower() 
        k=0 
        id_list=[] 
        for i in pb.pblist: 
            if s in i["Name"].lower() or s in i["Sex"].lower()  or s in i["Tel"].lower(): 
                k+=1 
                id_list.append(pb.pblist.index(i)) 
        print "\nThere are %s results:\n"% k 
        #print id_list 

            print "*******************************************" 
        print "  ID     NAME     SEX      TEL" 
        print "*******************************************" 
        for j in id_list: 
            print "%3s     " % str(j+1), 
            print "%-8s" % pb.pblist[j]["Name"], 
                    print "%-8s" % pb.pblist[j]["Sex"], 
            print "%-8s" % pb.pblist[j]["Tel"] 
                print "==========================================="        

                print ("\nContinue?(Y/N)\n") 
        while 1: 
                       con=raw_input() 
            if con=="Y": 
                            pb_search() 
                    elif  con=="N": 
                            main() 
            else: 
                print ("\nError! Continue?(Y/N)\n")

def pb_file(): 
        #print "This is the file function" 
        try: 
                f=file(pbfile) 
                pb.pblist=p.load(f) 
        except: 
                pb.list=[] 
        finally: 
                f.close() 

def pb_save(): 
        #print "This is the SAVE function" 
        try: 
                f=file(pbfile,"w") 
                p.dump(pb.pblist,f) 
                print "\nRecords saved successfully!\n" 
        finally: 
                f.close() 

def pb_quit(): 
        print "Thanks for your using!" 
        exit() 

def main(): 
        print """\ 
____________________________________________________  
|       Please select your choice:                 | 
|__________________________________________________| 
|       [A]: Add a record.                         | 
|       [B]: Browser the records.                  | 
|       [D]: Delete a record.                      | 
|       [S]: Search.                               | 
|       [Q]: Quit.                                 | 
|__________________________________________________| 
        \ 
        """ 
        while 1: 
                opp=raw_input() 
                if opp=="A": 
                        pb_add() 
                if opp=="B": 
                        pb_browser() 
                if opp=="D": 
                        pb_del() 
                if opp=="S": 
                        pb_search() 
                if opp=="Q": 
                        pb_quit() 

pb=phonebook() 
pbfile=("pb.dat") 
pb_file() 

main()
2009年5月18日 0 评论 344 阅读
技术

python, Zope,Plone之间的关系和安装

by 曾经沧海 2009年5月13日

Plone
Plone是什么?
Plone是免费的、开放源代码的内容管理系统(Content Management System,CMF)。Plone着重于适合各种组织使用。它带有一个工作流引擎、预先配置的安全和角色系统、一组内容类型和多语言支持。有来自全世界的众多开发者、作者和测试者每天为Plone做各种贡献。Plone是基于内容管理框架的。(Content Management Framework)。
主页:http://www.plone.org  中文主页:http://www.czug.org 中文商业支持:http://www.zopen.cn

什么是内容管理系统?

要给内容管理系统(CMS)下个定义很困难,比找个要卖给你CMS的人还难。简单来说,CMS用来管理内容,通常是为了web site管理内容。CMS的主要目的是用来方便的进行内容的创建、发布和修复,以适应商业应用。

内容管理的麻烦在于它的琐碎或不可能实现

不同CMS可以是否集成web分成两类:基于web的系统和非基于web的系统。Plone是免费的、开放源代码的基于web的内容管理系统。

为什么使用基于web的内容管理系统?

理解Plone这样的内容管理系统最简单的方法就是将它与标准web站点设计工具(如Macromedia Dreamweaver)进行比较。他们都可以在远程计算机上制作页面,并提交用来确认或发布。但有以下四个方面的区别:

任何具有所需权限的用户可在任何位置制作网页,使用标准浏览器,无需任何特殊软件。CMS的使用比Dreamweaver和FTP容易,只需很少的培训,许多制作任务可分配给不熟练的人员。因此,CMS使得更多的用户可在WEB上创建和编辑内容。同时,较少的培训和较低的技巧使得制作和维护的成本降低。

通过输入文本、上载文件到站点预先制作的模板中来制作页面,保证页面的统一风格。即使直接制作发布web页面的人员非常多,也可保证风格的统一,更重要的是内容结构的一致性也可保证。

CMS中的工作流控制可充分使用,web管理员的工作可有效的分配给工作在不同地点人员,并不会降低安全性,并保证质量标准。

不同版本的文档自动保存,需要时可进行自然的审核跟踪。

内容管理系统的这些优点对大型组织或大型合作项目更为重要。

什么是内容管理框架?

内容管理框架是一个应用,包括一系列Zope工具。这些工具构成的框架提供了许多内容管理系统需要的关键服务。内容管理框架可作为单独产品使用,或者如 Plone一样建立在它的基础之上。内容管理框架提供了核心的工具如Workflow(工作流)、个性化和目录化。内容管理框架的开发由Zope公司领导,是一个开发源代码的产品,受益于世界上众多的开发者的辛勤劳动。

主页:http://cmf.zope.org

什么是Zope?

Zope是一种开发源代码的web应用服务器,用python语言编写。它是可升级、稳固、功能强大的系统,包括一个对象数据库、web服务器和多种模板语言。Zope主要由Zope公司开发和提供支持,也可从来自世界各地的开发者得到帮助。

主页:http://www.zope.org 中文主页:http://www.czug.org 中文商业支持:http://www.zopen.cn

为什么使用Zope和Plone?

Zope和Plone是开放源代码软件(OSS),也就是说任何人可自由取得源代码。制作Zope和Plone的人的商业模型是从咨询服务中获取利益,主要在于定制或企业化应用。其他开放源代码CMS系统还有Midgard,Bitflux,OpenCMS和Wyona。

专有的和开放源代码的内容管理系统从技术上讲并没有什么不同。在两个阵营中,都有好的、中等的和较差的产品。文档和支持的质量也有很大不同。主要的不同是开放源代码的CMS相比专有系统而言,开放源代码的CMS由较小的公司制作。这就增加了对这些小公司能够持续多长时间,能够提供怎样的支持的怀疑。以我来看,不同之处更多的是表面的,而不是实际的东西。开放源代码的产品更小,对一个客户或一个关键人物的离去更加敏感,而专有系统产品较大,受收购(如 Allaire被Macromedia收购)和IT股票市场的反复无常(如Broadvision)的影响。不同在于,对开放源代码产品,用户可以取得源代码,可以进行维护、定制和开发。没有制作者的积极介入,这些工作对专有系统是无法完成的。这才是采用开放源代码产品的关键原因。

为什么采用Zope和Plone而不是其他开放源代码的CMS?Plone基于Zope,Zope是为建设内容管理软件的一个框架。在某种意义上, Zope是web应用的操作系统。CMF就是一个web应用,用来方便建设CMS。Plone就是一个基于CMF,运行在Zope上的内容管理系统,带有自己的一组模板和文件类型。以我们的观点(我们指的是由Web和Internet指导组WISG设立的CMS工作组的观点)Zope比其他竞争性产品更胜一筹在于以下原因:

Zope是面向对象的,在某种意义上,在Zope中出现的所有内容(网页、图像、链接、文件等)都是对象,包含在一个对象数据库中。数据库是层次化的,而不是关系型的,特别适合于层次化的文件结构。技术人员会认为数据库是行列结构的表格的集合,与主键值相关。Zope的数据库是不同的,与普通的文件系统结构很类似,对象包含在对象中。

Zope对象数据库中包含对象的所有老版本,这对撤销修改,对协作文档的版本控制和需要审核轨迹的元素非常有用。

Zope中包括大量特别适合大型组织和协同工作的工具,后面的手册中会介绍。例如:预定义的数据库搜索,基于灵活的搜索标准,自动显示符合特定用户定义条件的所有对象。

Zope可在所有平台上使用,包括:Unix,Linux,Mac OS和广受欢迎的Windows(98,2000,XP,NT),而其他开放源代码CMS或专有系统并非如此。

Zope是一个非常友好的开发环境。可通过点击按钮完成脚本的定制拷贝,而将原始版本保留在原来的位置,这是我遇到过的具有最好安全性的系统。

Zope中可方便的设计结构化XML文档,带有链接到文档结构的工作流。这是大型组织管理系统的基本特性,促进了文档结构和风格的一致性和流水线工作流。

最后,Zope为大型组织使用而设计,具有以下特性:大量贡献者致力于合作项目,他们位于不同地点,使用不同的平台。强大的组织需要灵活性和安全性,需要定义具有不同浏览、书写、编辑、批准大型项目不同部分权限的本地角色,可伸缩到大量对象和服务器。

第七,Zope team与竞争者的文化的不同对大型组织至关重要。Zope的一个客户US Navy,使用Zope管理RDproject,这是一个大型,公共部门组织,关注灵活性和安全性,对大部分公司都一样,无论公共的还是私有的。

就Plone(区别于Zope)而言,我认为超越基于Zope的通用的CMS的概念。Plone至少给Zope增加了两个有用的特性,对工程科学web站点非常重要:

整洁、雅致的导航框架,依赖于文件夹和内容视图,而不是html文档链接(需要更新)。受益于导航快捷方式(如公告栏,显示最近几天创建和修改的对象,避免了要浏览整个站点才能找到这些对象)的帮助

创建复杂结构文档的简单工具,如PIQ和UPC表单,每个文档的不同部分对不同的观众可见,可定制的确认路径

第一个特性使基于Plone的站点可以简单,快速的开始使用。第二个特性使它易于管理,不像其他CMS更多的构思发布而不是内容的处理。

什么是Python?

Python是功能强大的、解释性、交互式、面向对象的编程语言。Python是开放源代码的,可运行在几乎所有系统平台之上。Zope主要由Python编写,部分用C语言进行了优化。google的核心语言就是python,大名鼎鼎的BT下载软件

主页:http://www.python.org http://www.python.cn

BitTorrent也是python写的。

上述文章引用自: http://blog.sina.com.cn/s/blog_4bc5a0960100073x.html
===============================
以下文章转自:http://ddhjwxy.spaces.live.com/blog/cns!8A016BC37DDEF613!237.entry
CMS内容管理网站zope+plone的建立(安装篇)
这两天突然有个做个内容网站的想法,于是先把网站假设好了。现在先把安装部分先贴出来,以免年后正式开始建立网站的时候出现疏漏。
下面就开始我的安装过程:
我市全新安装一台Linux FC4(rhel 4和 rhel 3也可以),安装时只要选中Develop Tools就可以了,其他的软体都是用不到的。
一、安装python2.3.5(43MB)
1.从www.python.org下载到python2.3.5解压到临时目录下。
2.进入python的解压目录。
3.运行 ./configure –with-threads
4.运行 make && make install
5.在python2.3.5安裝后將/usr/local/bin/目錄下的python2.3和python拷貝到/usr/bin/目錄下(这一步仅在rhel3中需要,原因是/usr/bin/目錄下有python2.3和python這兩個文件,但是据我的觀察,這兩個文件的實質還是我原來的python2.2的,所以一定要有上面的那個步驟,这也可能是巧合)
二、安装PIL(Python Imaging Library 1.1.5 or higher)
1.从http://effbot.org/downloads/#Imaging下载PIL软件tar包,并解压到临时目录。
2.进入解压的目录。
3.运行$cd Imaging-1.1.5
4.运行$python setup.py build_ext -i
5.运行$python selftest.py
6.运行$python setup.py install
PS.为保证PIL安装的正确性,编译前请先确定TKINTER(需要tix的rpm包和devel包、fontconfig的rpm和devel包以及xorg-X11-devel),TCL(包括devel包),libjpeg(包括devel包),freetype2(包括devel包),zlib(包括devel包)这些包必须安装,否则无法正常安装完毕。
三、安装zope
1.从http://www.zope.org 下载并解压安装包
2.运行./configure –prefix=/usr/local/zope
3.运行make && make install
4.建立一个用户zope密码zope
5.运行/usr/local/zope/bin/mkzopeinstance.py
home 设定为 /home/zope
user 设定为 zope
密码 设定为 zope

四、安装Plone 2.1.1
1.从www.plone.org上下载与zope相应版本plone的tarball
2.解压到临时目录。
3.将解压出的内容都拷贝到/home/zope/Products下,并注意文件权限。group和owner都设定成zope用户和zope组。
4.将/home/zope/etc/zope.conf中的effectiv-user 设定为zope
五、运行/home/zope/bin/runzope &
六、打开浏览器输入http://ip:8080测试网站的正确性。点击Zope Management Interface 进入设定界面,需要输入的用户名密码就是三-5中设定的用户。
这样CMS(zope with plone)就搭建成功了。

2009年5月13日 0 评论 369 阅读
音乐

半梦半醒 谭咏麟

by 曾经沧海 2009年5月8日

2009年5月8日 0 评论 324 阅读
音乐

难舍难分 & 今夜情为证

by 曾经沧海 2009年5月8日

难舍难分

今夜情为证

2009年5月8日 0 评论 270 阅读
加载更多

热门

  • 无线餐饮点菜系统–去年的毕业设计

    2008年9月21日 36 评论 1.7k 阅读
  • Magento设置Paypal支付步骤

    2011年5月29日 1 评论 973 阅读
  • 垃圾

    2017年3月12日 0 评论 822 阅读
  • 记录

    2007年10月6日 0 评论 811 阅读
  • 办公室的两只猫

    2017年12月19日 0 评论 808 阅读

最新

  • 今天来了公司

    2023年1月27日 0 评论 8 阅读
  • 我觉得留在这个世界上,真没有意思

    2023年1月26日 0 评论 11 阅读
  • 世界还有好多美好的事,伯伯却看不到了

    2023年1月22日 0 评论 31 阅读
  • 我好想死

    2023年1月20日 0 评论 19 阅读
  • 对不起

    2023年1月20日 0 评论 23 阅读

分类

  • 图片 (71)
  • 外贸 (6)
  • 大学 (103)
  • 技术 (75)
  • 杂志 (290)
  • 电影 (13)
  • 资源 (1)
  • 随语 (61)
  • 音乐 (96)
  • 饮食 (3)

归档

  • 2023年1月 (27)
  • 2021年8月 (2)
  • 2021年1月 (1)
  • 2020年3月 (1)
  • 2019年3月 (1)
  • 2017年12月 (2)
  • 2017年3月 (2)
  • 2011年10月 (3)
  • 2011年8月 (1)
  • 2011年7月 (1)
  • 2011年5月 (1)
  • 2011年4月 (1)
  • 2011年1月 (2)
  • 2010年12月 (1)
  • 2010年9月 (2)
  • 2010年8月 (5)
  • 2010年7月 (1)
  • 2010年6月 (1)
  • 2010年5月 (2)
  • 2010年4月 (3)
  • 2010年2月 (4)
  • 2010年1月 (9)
  • 2009年12月 (3)
  • 2009年11月 (3)
  • 2009年9月 (11)
  • 2009年8月 (6)
  • 2009年7月 (1)
  • 2009年6月 (2)
  • 2009年5月 (7)
  • 2009年4月 (13)
  • 2009年3月 (14)
  • 2009年2月 (2)
  • 2009年1月 (12)
  • 2008年12月 (19)
  • 2008年11月 (1)
  • 2008年10月 (9)
  • 2008年9月 (12)
  • 2008年8月 (5)
  • 2008年7月 (7)
  • 2008年6月 (13)
  • 2008年5月 (4)
  • 2008年4月 (10)
  • 2008年3月 (7)
  • 2008年2月 (7)
  • 2008年1月 (11)
  • 2007年12月 (4)
  • 2007年11月 (8)
  • 2007年10月 (30)
  • 2007年9月 (25)
  • 2007年8月 (29)
  • 2007年7月 (32)
  • 2007年6月 (2)
  • 2007年4月 (1)
  • 2007年3月 (2)
  • 2007年2月 (5)
  • 2007年1月 (7)
  • 2006年12月 (11)
  • 2006年11月 (24)
  • 2006年10月 (13)
  • 2006年9月 (16)
  • 2006年8月 (21)
  • 2006年7月 (18)
  • 2006年6月 (9)
  • 2006年5月 (27)
  • 2006年4月 (44)
  • 2006年3月 (21)
  • 2006年2月 (9)
  • 2006年1月 (6)
  • 2005年12月 (12)
  • 2005年11月 (17)
  • 2005年10月 (44)
  • 2005年9月 (12)

标签

asp错误 (1) cache (1) django (1) joomla (8) joomla extension (3) magento (2) magento connect (1) Magento Email Templates (1) pink (1) Plone (1) python (3) QTP (1) sef (2) so what (1) stop 0x0000007b (1) Sugar In The Marmalade (1) vbs (1) virtuemart (3) Virtuemart Menu (1) Zope (1) 专升本 (4) 周慧敏 (2) 喜爱 (1) 国庆 (1) 域名注册,域名 (1) 学生处 (6) 我爱谁 (1) 我的大学 (6) 我的大学编年史 (6) 拉肚子 (1) 樊海军 (6) 物理学系 (6) 物理系 (4) 电子信息工程 (4) 简单电话薄 (1) 聚会 (1) 肇庆 (4) 肇庆学院 (6) 计算机系 (4) 谭咏麟 (3) 软件测试 (4) 邓奎元,蔡金生,喝酒 (1) 酸 (1) 黎明 (2) 黎明 对不起 (1)
  • 首页
  • 分类
    • 随语
    • 杂志
    • 外贸
    • 技术
    • 图片
    • 电影
    • 音乐
    • 饮食
    • 大学
  • 关于

@2005-2023 - 白菜粉条汤

白菜粉条汤
  • 随语
  • 杂志
  • 资源
  • 外贸
  • 技术
  • 图片
  • 电影
  • 音乐
  • 饮食
  • 大学
登入

保持登录状态,直到我退出

忘记密码了吗?

找回密码

新密码将通过电子邮件发送给您。

收到新密码了吗? Login here