Форум сайта python.su
Всем доброго времени суток, большая просьба - помогите пожалуйста переделать скрипт написанный под Python 2.7 в Python 3.7, сам я в питоне еще чуть больше чем ноль, мануалы есть но изучать долго,
у меня для работы есть готовый скрипт на Python 2.7 но старовата уже эта версия, т.к. Python изучать все равно буду но позже так что уже сейчас лучше поставлю Python 3.7 и буду постепенно изучать его
зачем мне регрессировать до 2.7, а этот скрипт написан под 2.7 и в 3.7 работать отказывается а он нужен уже сейчас и срочно помогите пожалуйста его переделать, думаю для профессионалов это будет быстро вот такой вот скрипт:
import mmap import struct import win32event import time import smtplib import sys def ControllerStart(Filter = "Tag", TimeOut = 60): #Создаем объект события готовности буфера для получения отладочных сообщений buffer_ready = win32event.CreateEvent(None, 0, 0, "DBWIN_BUFFER_READY") #Создаем объект события получения данных отладочного сообщения data_ready = win32event.CreateEvent(None, 0, 0, "DBWIN_DATA_READY") #Выделяем память под буфер обмена _buffer = mmap.mmap(0, 4096, "DBWIN_BUFFER", mmap.ACCESS_WRITE) timeStart = time.time() while time.time() < timeStart + int(TimeOut): #Устанавливаем событие готовности буфера для получения отладочных сообщений, #т.е. регистрируем "программу-ловушку" win32event.SetEvent(buffer_ready) #Если есть сигнал получения данных отладочного сообщения – обрабатываем его if win32event.WaitForSingleObject(data_ready, 1) == win32event.WAIT_OBJECT_0: _buffer.seek(0) #Получаем идентификатор процесса, отправившего отладочное сообщение process_id, = struct.unpack("L", _buffer.read(4)) #Считываем отладочное сообщение из буфера обмена data = _buffer.read(4092) #Считываем строку до символа окончания строки, если он присутствует if "\0" in data: str1 = data[:data.index("\0")] #иначе вся строка в буфере является отладочным сообщением else: str1 = data #Проверяем присутствие подстроки Filter в сообщении, #если она присутствует, считаем, что #отладочное сообщение получено от нашего скрипта Lua if str1.find(Filter) >= 0: ticks = time.localtime() #Выводим отладочное сообщение в консоль print ("Pid %d [%02d:%02d:%02d]: %s" % (process_id, ticks.tm_hour, ticks.tm_min, ticks.tm_sec, str1)) timeStart = time.time() #Если в течение установленного таймаута с момента #последнего отладочного сообщения не было получено #новых отладочных сообщений скрипа Lua - отравляем письмо if time.time() >= timeStart + int(TimeOut): SendMail ("Script %s" % Filter) def SendMail(MsgText): #От кого fromaddr = 'Mr. Robot <someaccount@test.com>'' #Кому toaddr = 'Administrator <administrator@test.com>' #Тема письма subj = 'Notification from Controller' #Текст сообщения msg_txt = 'Notice:\n\n ' + MsgText + '\n\nBye!' #Создаем письмо (заголовки и текст) msg = "From: %s\nTo: %s\nSubject: %s\n\n%s" % ( fromaddr, toaddr, subj, msg_txt) #Логин почтового ящика username = 'someaccount' #Пароль почтового ящика password = 'somepassword' #Инициализируем соединение с сервером по протоколу smtp server = smtplib.SMTP("smtp.mail.com:465") #Переводим соединение в защищенный режим (Transport Layer Security) server.starttls() #Авторизуемся на сервере server.login(username, password) #Отправляем письмо server.sendmail(fromaddr, toaddr, msg) print ("Message send to %s" % toaddr) #Закрываем соединение с сервером server.quit() if len(sys.argv) == 1: ControllerStart() elif len(sys.argv) == 2: ControllerStart(sys.argv[1]) elif len(sys.argv) == 3: ControllerStart(sys.argv[1], int(sys.argv[2]))
Отредактировано Nord99 (Фев. 23, 2019 12:44:36)
Офлайн
Nord99 код в теги
[code python][/code]
[code python][/code]
Офлайн
PEHDOMСпасибо поправил
для начала поменяйте if “\0” in data: на if b'\0' in data:
Отредактировано Nord99 (Фев. 23, 2019 16:08:55)
Офлайн
Будьте добры, подскажите еще пожалуйста как исправить:
1. что то не передаёт мне этот скрипт по емейлу полное содержимое строки str1, такое как оно происходит в событии win32event
2. Я зациклил скрипт чтобы он выполнялся без остановки а не один раз, поставил в конце while True:
while True: if len(sys.argv) == 1: ControllerStart() elif len(sys.argv) == 2: ControllerStart(sys.argv[1]) elif len(sys.argv) == 3: ControllerStart(sys.argv[1], int(sys.argv[2]))
Отредактировано Nord99 (Фев. 23, 2019 16:52:10)
Офлайн
Nord99оно вам говорит что Filter должет быть или числом или байтом, но не строкой. Разберитесь что вам приходит в data вот тут data = _buffer.read(4092), судя по всем там байты. следовательно вам или нужно работать с ними как с байтами, или преобразовывать в строку, если хотите работать с данными как с строкой.
if str1.find(Filter) >= 0:
TypeError: argument should be integer or bytes-like object, not ‘str’
[code python][/code]
Офлайн
PEHDOMА как их преобразовать в строку?
или преобразовывать в строку, если хотите работать с данными как с строкой.
Офлайн
Nord99обычно для этого используют метод decode(), учитывая что у вас венда, то както так:
А как их преобразовать в строку?
str1 = data.decode('cp1251')
[code python][/code]
Офлайн