【发布时间】:2009-03-19 23:25:03
【问题描述】:
我正在使用rss2email 将多个 RSS 提要转换为邮件以便于使用。也就是说,我正在使用它,因为它今天以一种可怕的方式坏了:每次运行时,它只会给我这个回溯:
Traceback (most recent call last):
File "/usr/share/rss2email/rss2email.py", line 740, in <module>
elif action == "list": list()
File "/usr/share/rss2email/rss2email.py", line 681, in list
feeds, feedfileObject = load(lock=0)
File "/usr/share/rss2email/rss2email.py", line 422, in load
feeds = pickle.load(feedfileObject)
TypeError: ("'str' object is not callable", 'sxOYAAuyzSx0WqN3BVPjE+6pgPU', ((2009, 3, 19, 1, 19, 31, 3, 78, 0), {}))
我能够从这个回溯中构建的唯一有用的事实是,rss2email 保存其所有配置和运行时状态的文件 ~/.rss2email/feeds.dat 以某种方式损坏。显然,rss2email 在每次运行时都会读取其状态并使用cPickle 将其转储回去。
我什至在巨大的 (>12MB) feeds.dat 文件中找到了包含上面提到的 'sxOYAAuyzSx0WqN3BVPjE+6pgPU'string 的行。在未经训练的人看来,转储似乎没有被截断或以其他方式损坏。
我可以尝试哪些方法来重建文件?
在 Debian/不稳定系统上的 Python 版本是 2.5.4。
编辑
Peter Gibson 和 J.F. Sebastian 建议直接从
pickle 文件,我之前尝试过。显然,Feed 类
需要在rss2email.py 中定义,所以这是我的脚本:
#!/usr/bin/python
import sys
# import pickle
import cPickle as pickle
sys.path.insert(0,"/usr/share/rss2email")
from rss2email import Feed
feedfile = open("feeds.dat", 'rb')
feeds = pickle.load(feedfile)
“普通”pickle 变体产生以下回溯:
Traceback (most recent call last):
File "./r2e-rescue.py", line 8, in <module>
feeds = pickle.load(feedfile)
File "/usr/lib/python2.5/pickle.py", line 1370, in load
return Unpickler(file).load()
File "/usr/lib/python2.5/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.5/pickle.py", line 1133, in load_reduce
value = func(*args)
TypeError: 'str' object is not callable
cPickle 变体产生与调用基本相同的东西
r2e自己:
Traceback (most recent call last):
File "./r2e-rescue.py", line 10, in <module>
feeds = pickle.load(feedfile)
TypeError: ("'str' object is not callable", 'sxOYAAuyzSx0WqN3BVPjE+6pgPU', ((2009, 3, 19, 1, 19, 31, 3, 78, 0), {}))
编辑 2
遵循 J.F. Sebastian 的建议,将“printf
调试”到Feed.__setstate__ 到我的测试脚本中,这些是
Python 退出前的最后几行代码。
u'http:/com/news.ars/post/20080924-everyone-declares-victory-in-smutfree-wireless-broadband-test.html': u'http:/com/news.ars/post/20080924-everyone-declares-victory-in-smutfree-wireless-broadband-test.html'},
'to': None,
'url': 'http://arstechnica.com/'}
Traceback (most recent call last):
File "./r2e-rescue.py", line 23, in ?
feeds = pickle.load(feedfile)
TypeError: ("'str' object is not callable", 'sxOYAAuyzSx0WqN3BVPjE+6pgPU', ((2009, 3, 19, 1, 19, 31, 3, 78, 0), {}))
同样的事情发生在使用 python 2.4.4-2 的 Debian/etch 机器上。
【问题讨论】:
-
pickle 格式非常简单。我记得我在解决pythonchallenge.com 谜题时手动解析了它(我是Python 的初学者,当时不认识pickle 格式)。因此,作为最后的手段,您可以手动从 feeds.dat 中提取必要的数据
-
这里的“by hand”代表一个简单的基于正则表达式的python脚本