#!/usr/bin/python2.4
# myzodb.py
import sys
import os
from ZODB import FileStorage
from ZODB import DB
import transaction
class MyZODB(object):
def __init__(self, path):
self.storage = FileStorage.FileStorage(path)
self.db = DB(self.storage)
self.connection = self.db.open()
self.dbroot = self.connection.root()
def close(self):
self.connection.close()
self.db.close()
self.storage.close()
from myzodb import MyZODB
if __name__ == '__main__':
#fetch_simple.py
db = MyZODB('/opt/Data.fs')
dbroot = db.dbroot
for key in dbroot.keys():
print key + ':',dbroot[key]
db.close()
运行的使用出错了:
[root@localhost python]# ./myzodb.py
Traceback (most recent call last):
File "./myzodb.py", line 5, in ?
from ZODB import FileStorage
File "/opt/Plone-2.5/lib/python/ZODB/__init__.py", line 20, in ?
from persistent import TimeStamp
File "/opt/Plone-2.5/lib/python/persistent/__init__.py", line 19, in ?
from cPersistence import Persistent, GHOST, UPTODATE, CHANGED, STICKY
ImportError: /opt/Plone-2.5/lib/python/persistent/cPersistence.so: undefined symbol: PyUnicodeUCS2_AsEncodedString
上网查询发现是由于我本机的python是4字节的Unicode,而plone中定义的函数接口是针对2字节的Unicode的,所以我就重新编译了本机的python-2.4.3
./configure --enable-unicode=ucs2 --prefix=$PY_HOME --with-readline --with-zlib
make
make install
为了确定我使用的python是2字节的,我这么测试的:
[root@localhost bin]# /opt/Plone-2.5/Python-2.4.3/bin/python
Python 2.4.3 (#1, Aug 4 2011, 14:59:31)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.maxunicode
65535
返回值=1114111 ucs-4
返回值=65535 ucs-2
编译之后的python的确是ucs-2的了,但是将myzodb.py程序的地一句话修改为:
#!/opt/Plone-2.5/Python-2.4.3/bin/python
怎么办?