Я использую 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/feeds.dat
, в котором rss2email
сохраняет всю свою конфигурацию и состояние времени выполнения, каким-то образом нарушен. Очевидно, rss2email
читает его состояние и выдает его обратно, используя cPickle
при каждом запуске.
Я даже нашел строку, содержащую упомянутую выше строку 'sxOYAAuyzSx0WqN3BVPjE+6pgPU'
в гигантском (> 12 МБ) файле feeds.dat
. На мой неподготовленный взгляд, свалка не выглядит усеченной или поврежденной иным образом.
Какие подходы я могу попробовать, чтобы восстановить файл?
Версия Python 2.5.4 для Debian / нестабильная система.
EDIT
Питер Гибсон и Дж.Ф. Себастьян предложили напрямую загрузить из
маринованный файл, и я пробовал это раньше. Видимо, класс 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)
«Простой» вариант рассола производит следующий возврат:
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
Следуя предложению Дж.Ф. Себастьяна, поставить "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), {}))
То же самое происходит в Debian / etch box, использующем python 2.4.4-2.