ProstoNoob 15 #195639 Posted June 25, 2014 Ничего не происходит.. Тупо снова строка ввода открывается.. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197349 Posted July 2, 2014 (edited) Всем привет! Сделал Альфу новой версии. Закидываю сюда, чтоб можно было пощупать. Скачать: (только для тестов!) Что уже сделано: 1. Исправлена ошибка в работе функции оступов, табуляция не всегда заменялась пробелами. 2. Вместо отдельных функций UnPyc 0.8.1 полностью задействован модуль pyREtic (теперь меньше крашиться на скриптах) 3. Добавлена функция декомпиляции загруженного в среде объекта (модуля, класса, функции) из модуля pyREtic (выделяете мышкой имя модуля или класса, в выпадающем меню выбираете "Decompile selected Object..." и вуаля). 4. И самое вкусное - запилил трансмиттер для обмена данными с клиентом игры. Трасмиттер сырой, только сейчас наладил его. Однако работает. Обмен данными идет через файловые мьютексы и буферы. Запуск клиента делается через Орион. В главном меню всё увидите. Как клиент запуститься можно в его среде выполнять любой код через Орион, пункт в меню отдельно сделан "Exec in client (SHIFT+F5)". Например вот такой код: from gui import SystemMessages SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning) Edited July 6, 2014 by StranikS_Scan 4 Quote Share this post Link to post Short link Share on other sites
lportii 14 #197374 Posted July 3, 2014 (edited) Не правильно подгружается код. Новый код не останавливает старый. Пример Исполняем- import BigWorld from gui import SystemMessages def _loop(): SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning) BigWorld.callback(2, _loop) _loop() Меняем Hello на Hello BigWold. Исполняем. Видим, что вылазят 2 месбокса с разными записями. Так не получится отладить скрипт. Старый должен останавливаться. п.с. И после дисконнекта, то же надо останавливать выполнение.(я подгружаю пустой модуль с тем же именем, хотя вроде после какой то из обнов заработал del module) Edited July 3, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
o-0-0-0 77 #197414 Posted July 3, 2014 Отличная программа ! Не хватает disassembler description Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197428 Posted July 3, 2014 @lportii, вся питоновская часть трансмиттера есть в wottransmission.zip. Глянь что не так. Я не проф. программист, потому буду весьма рад помощи спецов.Чтение и выполнение кода, который Орион сливает в буфер происходит тут - модуль transmitter.py: .... def orion_transfer_check(): global client_mutex, \ orion_mutex, \ orion_buffer if not orion_mutex.check(): client_mutex.lock() try: code = orion_buffer.read() finally: client_mutex.unlock() if len(code)>0: try: exec code in sys.modules[__name__].__dict__ except Exception as E: print str(E) BigWorld.callback(0.5, orion_transfer_check) .... Quote Share this post Link to post Short link Share on other sites
o-0-0-0 77 #197439 Posted July 3, 2014 можно в программу добавить откат назад написанного при ошибке и при выделении одинаковых значений что б выделялись все такие же значения (как в notepad++) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197440 Posted July 3, 2014 можно в программу добавить откат назад написанного при ошибке и при выделении одинаковых значений что б выделялись все такие же значения (как в notepad++) Ctrl+Z и Ctrl+Shift+Z работают. В выпадающем меню они вроде прописаны. Поиск и замена текста будет, все руки не доходят. А вот подсветка одинаковых значений - это кттс. 1 Quote Share this post Link to post Short link Share on other sites
lportii 14 #197445 Posted July 3, 2014 (edited) Не смеши, какой я специалист. Но попробовал. Должно быть что то вроде такого: import marshal m_code = compile(code, "<orion_script.py>", "exec") data = marshal.dumps(m_code) try: exec marshal.loads(data) except Exception as E: print str(E) Но оно не работает, виснет орион. Так тоже не хочет. m_code = compile(code, "orion_script.py", "exec") import types module = types.ModuleType('orion') sys.modules['orion_'] = module try: exec m_code in module.__dict__ except Exception as E: print str(E) Может та какие то ограничения есть, как то странно отказывается выполнять почти любое изменение. Edited July 3, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197449 Posted July 3, 2014 @lportii, у меня сейчас написано - exec code in sys.modules[__name__].__dict__ - это означает выполнить код (из Ориона) в окружении текущего модуля. Так как процедура orion_transfer_check() находиться в модуле transmitter.py, то и выполнение происходит в этом модуле. Выше ты попытался заменить это место на импорт виртуального модуля с кодом из буфера Ориона, т.е. код из буфера помешается в некий виртуальный модуль, который импортируется. Я конечно сделаю в Орионе команду типа - выполнить данный код как отдельный модуль.... Но меня волнует твой коммент выше. Я не уверен что именно про это ты писал. Quote Share this post Link to post Short link Share on other sites
lportii 14 #197453 Posted July 3, 2014 Если при запуске клиент игры запускает benchmarklocation из орионовского пакета то и код будет выполняться в среде клиента. Я немного не понял зачем тут mutex. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197466 Posted July 3, 2014 Если при запуске клиент игры запускает benchmarklocation из орионовского пакета то и код будет выполняться в среде клиента. Я немного не понял зачем тут mutex. Наверно мне стоит нарисовать схему работы трасмиттера и описать его логику. Сейчас займусь этим и опубликую через 1-2 часа. 1 Quote Share this post Link to post Short link Share on other sites
lportii 14 #197470 Posted July 3, 2014 (edited) Наверно мне стоит нарисовать схему работы трасмиттера и описать его логику. Сейчас займусь этим и опубликую через 1-2 часа. Да наверное Я выполнил код - import sys print sys.modules[__name__].__dict__ Сначала в Орионе, потом подключился к wot и выполнил еще раз. Там вполне ясно видно, какие модули подключены. Поэтому немного не понятно, почему не работает мой код. Заработало. Вот таким кодом я пытал Орион - code = str(\ 'from gui import SystemMessages'+('\n')+\ 'import BigWorld'+('\n')+\ 'def _loop():'+('\n')+\ ' SystemMessages.pushMessage("Hello Orion!", type=SystemMessages.SM_TYPE.Warning)'+('\n')+\ ' BigWorld.callback(2, _loop)'+('\n')+\ '_loop()'+('\n') ) try: del sys.modules["orion"] except: pass import marshal m_code = compile(code, "orion", "exec") import types module = types.ModuleType("orion") sys.modules["orion"] = module try: exec m_code in module.__dict__ except Exception as E: print str(E) Прямо в самом Орионе. "Hello Orion!" можно менять, что бы увидеть результат. Что бы выключить - code = "" try: del sys.modules["orion"] except: pass все так же не работает. Спасибо за отличную программу. Edited July 3, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197537 Posted July 3, 2014 (edited) Описалово в процессе, выложу завтра. Сегодня голова не работает. По поводу вот этого: Не правильно подгружается код. Новый код не останавливает старый. Пример Исполняем- import BigWorld from gui import SystemMessages def _loop(): SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning) BigWorld.callback(2, _loop) _loop() Меняем Hello на Hello BigWold. Исполняем. Видим, что вылазят 2 месбокса с разными записями. Так не получится отладить скрипт. Старый должен останавливаться. п.с. И после дисконнекта, то же надо останавливать выполнение.(я подгружаю пустой модуль с тем же именем, хотя вроде после какой то из обнов заработал del module) Если ты в среде объявил функцию _loop(), то ты можешь её удалить командой del __loop. И она удалиться из среды ВОТ. Проверил удаляется. Если ты запустил вызов этой функции по таймеру через BigWorld.callback.... а потом вызвал del __loop, то объявление функции удалиться, а очередной её вызов в BigWorld.callback приведет к ошибке, типа *** NameError: global name '_loop' is not defined. Так как ошибки перехватываются через try except, обертывающие команду exec code in...., то сам модуль и среда не крашатся, а спокойно продолжат работать, но функция __loop больше не вызывается. Импорт модулей из файла и виртуальный импорт я сделаю. Тогда проще будет убивать код через del модуль. Edited July 3, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
lportii 14 #197543 Posted July 3, 2014 Если ты в среде объявил функцию _loop(), то ты можешь её удалить командой del __loop. И она удалиться из среды ВОТ. Проверил удаляется. Если ты запустил вызов этой функции по таймеру через BigWorld.callback.... а потом вызвал del __loop, то объявление функции удалиться, а очередной её вызов в BigWorld.callback приведет к ошибке, типа *** NameError: global name '_loop' is not defined. Так как ошибки перехватываются через try except, обертывающие команду exec code in...., то сам модуль и среда не крашатся, а спокойно продолжат работать, но функция __loop больше не вызывается. Да, об этом говорили раньше. Но человек работающий с клиентом игры не должен думать о том как сделать правильно и работоспособно в Орионе. Все должно исполнятся точно как в клиенте, без всяких отступлений. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197547 Posted July 3, 2014 Да, об этом говорили раньше. Но человек работающий с клиентом игры не должен думать о том как сделать правильно и работоспособно в Орионе. Все должно исполнятся точно как в клиенте, без всяких отступлений. Не понятно что ты имеешь в виду. До этого момента с клиентом игры вообще ни как не работали. Запущенный клиент эмулирует обычную питоновскую среду, как например запущенный питон или запущенный Орион и т.п.... А Орион в данном случае выступает терминалом для общения с запущенной средой клиента. Quote Share this post Link to post Short link Share on other sites
lportii 14 #197551 Posted July 3, 2014 Раньше я пытался работать, и спрашивал как остановить модуль, а ты с МаксТ предлагал решения для частных случаев. Если Орион только терминал, почему мой простой подгузчик модулей через такой же exec не работает с запущеным Орионом? (что то вроде - Error import code..) Выше 112 посту я писал код в котором объявляется новый модуль 'orion', он вообще куда помещается? В среду клиента или в модуль Ориона в среде в среде клиента? Quote Share this post Link to post Short link Share on other sites
ProstoNoob 15 #197865 Posted July 5, 2014 Запустить можно только с игрой, например запустить реплей и там выполнять код, можно как? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197868 Posted July 5, 2014 Запустить можно только с игрой, например запустить реплей и там выполнять код, можно как? Запуск реплея будет. В течении часа выложу вторую тестовую версию с большим функционалом и описание логики работа трассмитера. Quote Share this post Link to post Short link Share on other sites
ProstoNoob 15 #197925 Posted July 5, 2014 (edited) Прошло 5 часов, автор как обычно пропал, наверно ответственность искать пошел.. Спасибо кстате что на 4-ке (сайте) ответил мне на сообщение 3-недельной давности.. Edited July 5, 2014 by ProstoNoob Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,116 #197952 Posted July 6, 2014 (edited) Прошло 5 часов, автор как обычно пропал, наверно ответственность искать пошел.. Спасибо кстате что на 4-ке (сайте) ответил мне на сообщение 3-недельной давности.. Вот завязывай давай. Не вышло за час, пошёл спать. Забавную штуку обнаружил, оказывается питон в клиенте "замирает" когда реплей на паузе стоит и обмен данными не идет. Буфер от Ориона клиент даже читать не хочет. А делаю скорость прокрутки реплея не 0 и всё работает. Не очень приятный нюанс, но жить можно. Выкладываю вторую Альфу! Скачать: Что изменилось от первой Альфы: 1. Убрано ограничение на формат файлов, открываемых через Drag-And-Drop 2. Добавлена опция групповой отмены действий в редакторе "Group operations" 3. Реализованы поиск и замена текста в редакторе 4. По WOT-Transmission, по мимо мелких доработок и поддержки UTF-8, чтоб кириллица не пропадала, добавил функции: Game replays... - можно загружать клиент с реплеем Close WorldOfTanks - можно убить клиент (очень удобно и не страшно, так как настройки клиента не пропадают) Import/Reload current script - текущий скрипт XXX.py, открытый в редакторе будет импортирован как модуль XXX в игру, если такой модуль уже есть, то будет выполнена его перезагрузка Import/Reload py-file... - можно импортировать (перезагрузить) любой левый скрипт Open <preferences.xml> - откроет ваш preferences.xml, зачем, да просто так, может кому пригодиться чтоб далеко не лазить 5. Также в окне Options, я добавил опцию запуска клиента - полный экран, окно, окно на весьма экран, очень удобно (юзается preferences.xml) Теперь небольшие замечания и разъяснения: 1. Как работает WOT-Transmission Обратите внимание WOT-Transmission это отдельная фича, при этом со средой питона, которую эмулирует Орион, она ни как не связана. Ваши скрипты Орион в текстовом виде отправляет в буфер orion_buffer, а на стороне клиента идёт чтение этого буфера и выполнение записанных в нем скриптов. Для этого при загрузке клиента Орион скармливает ему модули из пакета wottransmission.zip, которые и отвечают за прием и выполнение скриптов в клиенте. Кроме того вся инфа поступающая в лог в клиенте перехватывается и направляется в буфер client_buffer, от куда её забирает уже Орион и выводит пользователю. Для того чтобы избежать конфликтов доступа двух программ к одному буферу используются файловые мьютексы client_mutex и orion_mutex. Таким обзором, для работы с питон-средой клиента надо юзать только опции из меню WOT-Transmission->. 2. Перезагрузка модулей в клиенте игры Все кто с ней сталкиваются знают, что проблема перезагрузки заключается во внешних ссылках на загруженный модуль. Если из другого модуля обратиться к текущему и импортировать какой-либо элемент, то будет вот такая внешняя ссылка. Обычный метод reload() эти ссылки ни как не обновляет. Поэтому я нашел в тырнете модуль rebuild.py (лежит в wottransmission.zip) и задействовал его для перезагрузки. Он не только делает reaload(), но и пробегает по всем загруженным модулям и пытается обновиться ссылки в них. Поэтому если взять код выше: import BigWorld from gui import SystemMessages def _loop(): SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning) BigWorld.callback(2, _loop) _loop() Импортировать его командой "Import/Reload current script", то начнут вылазить сообщения "Hello!", как и ожидается. Затем изменить его на: import BigWorld from gui import SystemMessages def _loop(): SystemMessages.pushMessage('Hello222222222!', type=SystemMessages.SM_TYPE.Warning) BigWorld.callback(2, _loop) И импортировать его снова командой "Import/Reload current script", то старый модуль замениться на новый и вместо "Hello!", начнуть вылазить "Hello2222!". 3. Полное удаление или остановка модуля Над этим я пока работаю....... Если внешних ссылок на модуля нет (типа как BigWorld.callback(2, _loop) из примера выше), то достаточно наверно просто del модуль сделать или зарелодить пустой модуль, а потом убить его имя. Но вот если внешние ссылки есть, то фиг от них избавишься таким путем. Чтобы "Hello!" перестал вылазить нуно сделать del _loop.....либо, либо доработать модуль rebiuld.py, чтоб он убивал внешние ссылки если мы "удаляем" модуль. 4. И по реплеям... ОБРАТИТЕ ВНИМАНИЕ! Когда реплей остановлен, то клиент "спит" и скрипты, отправленные Орионом в буфер, будут просто в нем накапливаться. Как только вы продолжите воспроизведение клиента, он "проснётся" и они все будут им выполнены. Edited July 9, 2014 by StranikS_Scan 2 Quote Share this post Link to post Short link Share on other sites