TypeError при попытке загрузить изображения из Google App Engine в Picasa с помощью GData API.

Я пытаюсь написать небольшой инструмент для загрузки изображений из Google App Engine в Picasa. Получение изображения работает, но когда я пытаюсь загрузить его, я получаю сообщение об ошибке "TypeError: stat() аргумент 1 должен быть (закодированная строка без NULL байтов), а не str"

Код в основном выглядит так:

def getfile(url):
    result = urlfetch.fetch(url)
    if result.status_code == 200:
        return (result.content)
    logging.error ("[-] Error fetching URL: %s" % url)

def uploadpicture(comment,pic):
    album_url = '/data/feed/api/user/%s/album/%s' % (username, album)
    fname = "image.jpg"
    entry = gd_client.InsertPhotoSimple(album_url, fname, comment, pic, content_type='image/jpeg')

picurl = "http://brilliantleap.com/blog/frog.jpg"
pic = getfile(picurl)
comment = "Test"
uploadpicture(comment, pic)

Полная трассировка стека:

Traceback (последний последний вызов):

Файл "/home/birt/stuff/google/appengine/ext/webapp/init.py", строка 507, в call handler.get(*groups)

Файл "/home/birt/stuff/app_picasaupload/main.py", строка 124, в get uploadpicture(comment, pic)

Файл "/home/birt/stuff/app_picasaupload/main.py", строка 104, в записи uploadpicture = gd_client.InsertPhotoSimple(album_url, fname, comment, pic, content_type='image/jpeg')

Файл "/home/birt/stuff/app_picasaupload/gdata/photos/service.py", строка 469, в InsertPhotoSimple content_type)

Файл "/home/birt/stuff/app_picasaupload/gdata/photos/service.py", строка 398, в InsertPhoto os.path.exists(filename_or_handle): # это имя файла

Файл "/usr/lib/python2.5/posixpath.py", строка 171, существует st = os.stat(path)

Файл "/home/birt/stuff/google/appengine/tools/dev_appserver.py", строка 1109, в вызове, если не FakeFile.IsFileAccessible(путь):

Файл "/home/birt/stuff/google/appengine/tools/dev_appserver.py", строка 1018, в IsFileAccessible normcase=normcase)

Файл "/home/birt/stuff/google/appengine/tools/dev_appserver.py", строка 1036, в _IsFileAccessibleNoCache, если os.path.isdir(logical_filename):

Файл "/usr/lib/python2.5/posixpath.py", строка 195, в isdir st = os.stat(путь)

TypeError: stat() аргумент 1 должен быть (закодированная строка без байтов NULL), а не str

Любые идеи ? :-)


person Birt    schedule 11.11.2009    source источник
comment
Это невозможно сказать без фактического кода и полной трассировки стека.   -  person Nick Johnson    schedule 11.11.2009
comment
Вы случайно не используете Python 3? Это то, что предлагает сообщение об ошибке. Appengine SDK специально поддерживает (и, конечно, производственную версию тоже ;-) Python 2.5, а не более поздние версии в настоящее время.   -  person Alex Martelli    schedule 11.11.2009
comment
Это не исключение, о котором вы изначально сказали, что получаете. Как следует из исключения, вы пытаетесь получить недопустимый URL-адрес.   -  person Nick Johnson    schedule 11.11.2009
comment
Извините, Ник, сначала я опубликовал неправильную трассировку стека - исправлено :)   -  person Birt    schedule 12.11.2009
comment
Alex: Я запускаю SDK явно с python2.5   -  person Birt    schedule 12.11.2009
comment
может ли кто-нибудь решить мою проблему, связанную с этим? Спасибо! stackoverflow.com/questions/26337519/   -  person jjjj    schedule 14.10.2014


Ответы (1)


Решением этой проблемы было использование StringIO :-)

( http://docs.python.org/library/stringio.html )

добавление

pic = StringIO.StringIO(pic)

преобразует result.content из urfetch в файловый формат, ожидаемый gdata.

person Birt    schedule 12.11.2009
comment
У меня была аналогичная проблема, когда я пытался разархивировать строку с помощью библиотеки zipfile, и это помогло. - person Eli Albert; 22.07.2014