Найти - Пользователи
Полная версия: MemoryError...
Начало » Python для новичков » MemoryError...
1
boltayka
В прошлый раз писал тему по пост-запросам, её проигнорировали.. Благо, очень долго разбирав код написал все-таки скрипт (не с нуля, сырцы чужие в нём присутствуют :))

import os
import urllib.request
import urllib.parse
import re
import codecs,http.client,random
import hashlib
import json
from xml.dom.minidom import parse, parseString

def login (mail, pas):
global vk
global cookie
res = urllib.request.urlopen('http://login.vk.com/?act=login&email='+mail+'&pass='+pas+'&expire=&vk=')
res= res.read().decode()
#print(res)
if re.search(' value=\'',res)!=None:
print(res)
s = re.search(r"name='s' value='(.*?)' \/>",res)
sid = s.group(1)
print(sid)
cookie = 'remixap=1; remixlang=0; remixchk=5; remixsid='+sid
vk = urllib.request.build_opener()
vk.addheaders = [('cookie', cookie)]
else:
cookie=0

return cookie

s=login('Тут было мыло','А тут пароль')#Авторизация

for i in os.listdir('E:\\Фильмы\\Dr.House Season I'):
print('E:\\Фильмы\\Dr.House Season I\\'+i)
data=open('E:\\Фильмы\\Dr.House Season I\\'+i,'rb').read().decode('latin-1')
print('0')

data='''
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="Filename"

trololo.avi
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"; filename="trololo.avi"
Content-Type: application/octet-stream

%s
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"

Submit Query
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6--
''' % (data)

api='1895617' #id приложения
secret = 'bszTIcIkzk' #secret key
#api='1967034'#id приложения
#secret = '0D4ajwn4STyFbCMZDSpA' #secret key
res = vk.open('http://vkontakte.ru/feed.php').read().decode('cp1251')
res = re.split('[\=,\,]+',res)
vid = res[1]#парсим id
print(vid)
sig=vid+'api_id='+api+'method=video.savev=2.0'+secret
sig=hashlib.md5(sig.encode()).hexdigest()
print('Get url to upload')
link='http://api.vkontakte.ru/api.php?api_id='+api+'&method=video.save&v=2.0&sig='+sig
res=vk.open(link).read().decode()#Получаем url для загрузки
#print(res)
dom1 = parseString(res)
print(res)
dom1=dom1.getElementsByTagName("upload_url")[0]
link=dom1.childNodes[0].data
print(link)
headers = {"Content-type": "multipart/form-data; boundary=----------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6","Accept": "text/*",'Cookie':s,"User-Agent": "Shockwave Flash"}
link=re.split('[\/]+',link)
print(link)
conn = http.client.HTTPConnection(link[1])
conn.request("POST", "/"+link[2], data, headers)
response = conn.getresponse()
c = response.msg
res=response.read().decode()#загружаем
print(res)
data.close()
Вкратце объясню: скрипт заливает видео через API во вконтакте…
Тестировал на видюхах по 5-15 секунд (1-3 МБ) - все работало великолепно. Решил запустить с видео 350+ MБ, и ни в какую.. Строку (data=open('E:\\Фильмы\\Dr.House Season I\\'+i,'rb').read().decode('latin-1')) он выполняет, а вот дальше…
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 54, in <module>
''' % (data)
MemoryError
Как-то может можно переписать этот момент?.. Очень прошу помочь, т.к. 2 дня работы не хочу тратить в пустую… Может даже малясь поощрю на мобильный ответившего по делу))
Андрей Светлов
А вы по кусочкам. Целиком киношку зачитать - памяти не хватает.

Вместо conn.request('POST', …)
делайте

data = open(path_to_file, 'rb')

prefix = '''
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="Filename"

trololo.avii
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"; filename="trololo.avi"
Content-Type: application/octet-stream

'''
suffix = '''
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"

Submit Query
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6--
'''

conn.putrequest('POST', url)
conn.putheader("Content-Type": "multipart/form-data")
conn.putheader(...) # по порядку проталкиваете все HTTP заголовки
# не забудьте Content-Length - его прийдется посчитать самому prefix + длина файла + suffix
conn.endheaders()
conn.sendall(prefix)
while True:
part = data.read(8192)
if part is None:
break
conn.sendall(part)
conn.sendall(suffix)

conn.getresponse()
boltayka
С горем пополам дошел до момента conn.sendall(prefix)
Выдало:
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 87, in <module>
conn.sendall(prefix)
AttributeError: 'HTTPConnection' object has no attribute 'sendall'
Полез искать сырцы этого модуля в папке с питоном (3.1). Функции sendall нету, но есть намёк на неё в функции send.
Попробовал conn.send(prefix)
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 87, in <module>
conn.send(prefix)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
TypeError: must be bytes or buffer, not str
Андрей Светлов
Послушайте, boltayka, думайте все же иногда - это может оказаться приятным.
sendall действительно нет, я ошибся. .send отлично подойдет.
Если видите must be bytes or buffer, not str - возможно так оно и есть?
пишите s.encode('latin-1') чтобы превратить строку в последовательность байт. latin-1 - кодировка для вашего случая.
boltayka
Ну, что поделать.. Я только учусь. Все вначале тупят)
Спасибо за помощь…
Хотя, видать, по кускам оно так или иначе не будет отправлять.
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 94, in <module>
conn.send(part)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
Сначала пробовал как Вы показали, (part = data.read(8192)), выдавало эту (выше) ошибку.. Вывел через print значение part, получал примерно следующее:
b''
b''
b''
b''
b''
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 94, in <module>
conn.send(part)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
По моему part = data.read(8192) в каждом круге цикла отправляет одно и тоже.

Полез гуглить, нашел это: http://www.velocityreviews.com/forums/t647197-python-3-read-function.html
Переписал через io загрузку файлов

vContent = io.BytesIO()
data = io.open('E:\\videos\\4ac509fbe9.flv','r+b',0)
#data = open('E:\\videos\\4ac509fbe9.flv', 'rb')
vContent = data.read()
vSplitContent = vContent.split()
print(vSplitContent[-1])


#Много неинтересного кода, который есть выше...

conn = http.client.HTTPConnection(link[1])
conn.putrequest('POST', link[2])
conn.putheader('Content-Type', 'multipart/form-data; boundary=----------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6')
conn.putheader('Accept', 'text/*')
conn.putheader('Cookie', s)
conn.putheader('User-Agent', "Shockwave Flash")
q = len(prefix)+len(data.read())+len(suffix)
conn.putheader('Content-Length', str(q).encode('latin-1'))

# не забудьте Content-Length - его прийдется посчитать самому prefix + длина файла + suffix
conn.endheaders()
conn.send(prefix.encode('latin-1'))

for part in vSplitContent:
conn.send(part)
print(part)
conn.send(suffix.encode('latin-1'))

conn.getresponse()
conn.close()
В ответ
#...............
b'FLV\x01\x05\x00\x00\x00'
b'\x00\x00\x00\x00\x12\x00\x02\xfd\x00\x00\x00\x00\x00\x00\x00\x02\x00'
b'onMetaData\x08\x00\x00\x00\x1a\x00\x07creator\x02\x00\x06Vk.com\x00\x0fmetadatacreator\x02\x003Yet'
b'Another'
b'Metadata'
b'Injector'
b'for'
b'FLV'
b'-'
b'Version'
b'1.4\x00'
b'hasKeyframes\x01\x01\x00\x08hasVideo\x01\x01\x00\x08hasAudio\x01\x01\x00'
b'hasMetadata\x01\x01\x00'
b'canSeekToEnd\x01\x00\x00\x08duration\x00@\x1f\\(\xf5\xc2\x8f\\\x00\x08datasize\x00A\x1a\xac'
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 94, in <module>
conn.send(part)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
Андрей Светлов
io.BytesIO - штука хорошая, но избыточная. Давайте без нее как-нибудь.

Первое. Длина передаваемого файла определяется как
os.fstat(data.fileno()).st_size
А вы пытались вычитать содержимое файла. Потом, конечно, цикл с send у вас не заработал - если файл прочитан до конца, то с него уже ничего не выжать.

Второе. Еще раз смотрим на передачу контента файла

while True:
part = data.read(8192) # читать 8Кб
if not part: # пустой объект означает, что достигнут конец файла
break
conn.send(part) # пока есть что переслать - посылаем
boltayka
Дык в этом во всем я разобрался и так (ну, кроме длины файла.. Тут не знал)

проблема то в первую очередь из-за:
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
leonid_10
А, мне подскажет кто-нибудь?
Проблема аналогичная с разницей в том, что нужно создать картинку весом в 1.5 кило , используя cairo, вызывая функцию из блендера.
Отдельно функция запускается без проблем:
import cairo
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, 640, 640)
cr = cairo.Context(surface)
pathSave="/home/leonid/test.png"
surface.write_to_png("%s"%pathSave)
А, вот, если эта функция в блендерскрипте:
class TextureCairoCreate(Operator):
    bl_idname = "tex.cairo_create"
    bl_label = "Create image"
    def execute(self, context):
        tex=context.texture
        surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, tex.pov.cr_image_width, tex.pov.cr_image_height)
        cr = cairo.Context(surface)
        pathSave=tex.pov.cr_path_save
        surface.write_to_png("%s"%pathSave)
        return {'FINISHED'}
То:
Traceback (most recent call last):
File “/home/leonid/blender/blender-2.68/2.68/scripts/addons/render_povray/__init__.py”, line 1662, in execute
surface.write_to_png(“%s”%pathSave)
MemoryError
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB