как запустить скрипт в игре
Запуск Python и python-скрипт на компьютере
Код, написанный на языке Python, может храниться в редакторе кода, IDE или файле. И он не будет работать, если не знать, как его правильно запускать.
В этом материале рассмотрим 7 способов запуска кода, написанного на Python. Они будут работать вне зависимости от операционной системы, среды Python или местоположения кода.
Где запускать Python-скрипты и как?
Python-код можно запустить одним из следующих способов:
Запуск Python-кода интерактивно
Для запуска интерактивной сессии нужно просто открыть терминал или командную строку и ввести python (или python3 в зависимости от версии). После нажатия Enter запустится интерактивный режим.
Вот как запустить интерактивный режим в разных ОС.
Интерактивный режим в Linux
Откройте терминал. Он должен выглядеть приблизительно вот так :
После нажатия Enter будет запущен интерактивный режим Python.
Интерактивный режим в macOS
На устройствах с macOS все работает похожим образом. Изображение ниже демонстрирует интерактивный режим в этой ОС.
Интерактивный режим в Windows
Запуск Python-скриптов в интерактивном режиме
В таком режиме можно писать код и исполнять его, чтобы получить желаемый результат или отчет об ошибке. Возьмем в качестве примера следующий цикл.
Для выхода из интерактивного режима нужно написать следующее:
И нажать Enter. Вы вернетесь в терминал, из которого и начинали.
Есть и другие способы остановки работы с интерактивным режимом Python. В Linux нужно нажать Ctrl + D, а в Windows — Ctrl + Z + Enter.
Стоит отметить, что при использовании этого режима Python-скрипты не сохраняются в локальный файл.
Как выполняются Python-скрипты?
Отличный способ представить, что происходит при выполнении Python-скрипта, — использовать диаграмму ниже. Этот блок представляет собой скрипт (или функцию) Python, а каждый внутренний блок — строка кода.
При запуске скрипта интерпретатор Python проходит сверху вниз, выполняя каждую из них. Именно таким образом происходит выполнение кода.
Но и это еще не все.
Блок-схема выполнения кода интерпретатором
Это набор инструкций, которые приводят к финальному результату.
Иногда полезно изучать байткод. Если вы планируете стать опытным Python-программистом, то важно уметь понимать его для написания качественного кода.
Это также пригодится для принятия решений в процессе. Можно обратить внимание на отдельные факторы и понять, почему определенные функции/структуры данных работают быстрее остальных.
Как запускать Python-скрипты?
Для запуска Python-скрипта с помощью командной строки сначала нужно сохранить код в локальный файл.
Возьмем в качестве примера файл, который был сохранен как python_script.py. Сохранить его можно вот так:
Сохранить скрипт в текстовом редакторе достаточно легко. Процесс ничем не отличается от сохранения простого текстового файла.
Но если использовать командную строку, то здесь нужны дополнительные шаги. Во-первых, в самом терминале нужно перейти в директорию, где должен быть сохранен файл. Оказавшись в нужной папке, следует выполнить следующую команду (на linux):
После нажатия Enter откроется интерфейс командной строки, который выглядит приблизительно следующим образом:
Теперь можно писать код и с легкостью сохранять его прямо в командной строке.
Как запускать скрипт в командной строке?
Script-server. WebUI для удалённого запуска ваших скриптов
Всем привет. В данной статье я бы хотел рассказать про свой домашний проект. Если коротко: Script server является веб-сервером для предоставления пользователям доступа к вашим скриптам через web-интерфейс. Сервер и скрипты запускаются локально, а параметризуются и показываются удалённо.
Предыстория
На новом месте работы, первые мои задачи были весьма рутинны и однообразны. Схематично они выглядели так:
Надо сказать, что к определённому моменту подобные задачи уже перестали на меня назначать и у созданных скриптов без необходимой адаптации было очень призрачное будущее.
Поэтому я решил создать инструмент, который позволит удалённо запускать мои скрипты другим людям, без необходимости создавать необходимое окружение и в более удобной форме настраивать их запуск.
На пути создания
Схема работы
Администратор сервера (т.е. я) создаёт файлы конфигурации для каждого скрипта, в которых описывает предназначение скрипта, путь запуска и требуемые параметры. Эти файлы конфигурации используются сервером для предоставления данных о скриптах пользователю, а также для их запуска. Информация на страницу пользователя передаётся Ajax запросами.
Пользователь заполняет параметры и запускает скрипт на сервере, где его выполнение передаётся специальному обработчику. Обработчик в асинхронном режиме принимает input и предоставляет output, а также следит за процессом выполнения скрипта.
Веб сервер служит прослойкой между этим обработчиком и страницей, и через веб-сокеты осуществляет обмен данными.
Выбор инструментов
В то время я учил Python и для разработки решил использовать именно его, как неплохую практику. Для проекта был выбран Python 3, без поддержки 2й версии, поскольку необходимости в этом нет, а тратить лишнее время не хотелось.
В начале разработки для сервера я использовал Flask, но не смог сделать (читай разобраться) с асинхронностью и отслеживанием подключения/отключения клиентов, поэтому довольно быстро перевёл все на Tornado.
Касаемо web разработки: Web-разработчик из меня никакой, поэтому здесь я тоже решил немного попрактиковаться в синтаксисе и основах. В связи с этим не было использовано почти никаких фреймворков и библиотек, за исключением materializecss для более-менее приличного оформления.
Web страница представляет собой «одностраничное приложение» с минимумом HTML и созданием контента в JS по Ajax запросам.
Первая эксплуатация и улучшения
Примерно через месяц у меня получился сервер, который худо-бедно можно было использовать и я поделился им с коллегами-разработчиками, которым тоже приходилось выполнять эти рутинные задачи (которые как назло в этот период почти закончились).
В процессе эксплуатации были обнаружены как баги, так и явно недостающие элементы, над которыми я потихоньку работал и улучшал. В то же время были добавлены мелкие улучшения, такие как типы параметров, логгирование всех запусков и т.п.
Интересный момент: для некоторых мелких задач (связанных с работой в консоли и со скриптами) я также перестал пользоваться консолью, а перешёл на этот UI. Т.е. у меня заведено несколько конфигураций скриптов, которые я использую чаще, чем другие люди.
Эксплуатация реальным пользователем
Спустя некоторое время локального тестирования (мною и другими разработчиками), инструмент был наконец предоставлен руководителю проекта, который начал потихоньку им пользоваться. И надо отметить, что он очень доволен, т.к. это экономит в том числе и его время. Процесс «внедрения» и обучения пользователя занял примерно 5 минут.
Из-за особенностей процессов и ограничений, Script server используется в основном для тестового окружения. Но некоторые его части уже стали использоваться и для Production (в той части, где это безопасно).
Основные камни
Ниже приведён список проблем и моих личных открытий, которые мне больше всего запомнились.
Передача выходных данных из процесса выполнения скрипта на страницу в асинхронном режиме. Тут сказалось отсутствие опыта как во Flask, так и в вебе: как лучше организовать такую передачу. В итоге реализовал на вебсокетах передачу данных в виде событий (тип и данные). Также в событиях можно отправлять и другие команды во время выполнения, но пока это не используется.
Передача ввода пользователя в исполняемый скрипт. Пытался сделать запрос на ввод только при ожидании такового в скрипте, но не нашёл способа. Поэтому пользователи во время выполнения скрипта могут вводить столько информации, сколько хотят (обычный терминал ведет себя так же). Данные отправляются через тот же вебсокет.
Отслеживание отключения пользователей. Именно из-за этой проблемы отказался от Flask: в тот момент я делал не на вебсокетах, а на SSE (ну почти). Однако позже я все же перевёл передачу input/output скрипта на вебсокеты, так что возможно и Flask бы подошёл. В Торнадо же просто можно подписаться на закрытие вебсокета.
Output скриптов в (не)терминальном режиме. Честно говоря для меня это было открытием: output скриптов может отличаться если запускать их в терминале или вне. Например тот же…
… показывает input_prompt только в терминальном режиме. Не очень хорошо чего-либо ждать от пользователей, не показывая им чего именно. Пришлось разбираться с pty, чтобы обманывать запускаемые скрипты. По этой причине у меня сейчас два типа обёрток для запуска скриптов: с поддержкой терминала и без. Первый включается по-умолчанию, второй можно включить с помощью конфигурации (оставил его на всякий случай, если терминальный режим будет сбоить).
Автоскролл выходных данных скрипта. С одной стороны это решается довольно просто, с другой стороны были проблемы с настройкой автоматического отключения этого (если пользователь скроллит вручную или выделяет текст), а также с тенью, вводом пользователя и т.п. Ничего экстраординаорного, но несколько часов потратить пришлось.
Настройка панели с выходными данными скрипта таким образом, чтобы она занимала всё доступное место, но при этом никогда не выходила за границы окна. Таким образом страница всегда умещается в окно и единственный скролл добавляется именно внутри output панели. Для меня это было особенно важно, т.к. я категорично не люблю скроллы в скроллах.
Производительность страницы при очень большом количестве выходных данных скрипта. Тут со мною злую шутку сыграл следующий код:
Дело в том, что получение innerText это сама по себе довольно ресурсоёмкая операция, которая пытается представить входящий html как строку, даже если это просто текст. Если вызывать эту операцию пару сотен раз и для тысячи символов, то эффект не заметен, но в моем случае данных было гораздо больше и браузер просто зависал на несколько минут от такой нагрузки. Решилось изменением кода на следующий:
Висящие процессы, т.е. никто ничего не выполняет, но в процессах висит выполняемый скрипт. Причины были разные, например: пользователь закрыл страницу, а сервер не обрабатывает это. Или не закрытый дескриптор файла. Или незакрытые дочерние процессы. И это не считая других очевидных багов. Но устранялось все гуглёнием, изучение и исправлением.
Безопасность
Её нет, совсем. Данный инструмент рассчитан на локальный запуск и работу в локальной сети с доверенными пользователями. Поскольку зачастую скрипты тоже пишутся для себя, они также не являются особо защищёнными. Соответственно прежде чем запускать такой сервер, нужно быть на 100% уверенным в фаерволле и пользователях.
С точки зрения скрытия данных, в Script server на текущий момент также ничего нет. Включать пароли в качестве параметров или в конфигурацию крайне не рекомендуется, поскольку они будут логироваться и храниться в чистом виде.
Примеры и скриншоты
Для отладки в проекте я завёл тестовые конфигурации, которые можно использовать для тестирования и демонстрации. В данном разделе все предоставленные скриншоты будут основываться на них.
Конфигурация скриптов
Относительно стандартный баш скрипт с параметрами, вводом пользователя во время работы и печатью: Write file.
Простой питон-скрипт, который выводит стену текста, разбивая его на абзацы и запрашивая input пользователя: Destroy world. Эта конфигурация используется для отладки пользовательского интерфейса при отображении параметров. Содержит все возможные типы параметров: Parameterized
Скриншоты
Полный экран
Слева область выбора скриптов, справа информация по текущему открытому скрипту:
Панель параметров
В этом хаосе можно увидеть семейство разных типов параметров: обязательные, списки, числа, булеаны. Скриншот создан на основе конфигурации Parameterized
Панель input/output
Сверху кнопки запуска и остановки. Поскольку скрипт запущен, активна только последняя. Ниже панель выходных данных скрипта, в самом низу поле для ввода входных данных. Панель выходных данных сжата по высоте для демо-цели, в обычном окне она гораздо выше.
Дальнейшие шаги
На данный момент разработка не ведётся, т.к. в текущем виде Script server полностью покрывает возложенные на него задачи. Что-либо оптимизировать в текущем интерфейсе я также не вижу необходимости. Таким образом мы с ним оба находимся в ожидании новых вызовов и проблем.
В частности, я был бы крайне рад, если бы данный инструмент так же пригодился кому-либо из хабрасообщества и у меня бы появилась необходимость в новых улучшениях.
Список используемых библиотек/фрейворков/благодарностей:
Идеальный скрипт запуска сервера Minecraft
Автор очень любит игру, и сам является администратором небольшого сервера «чисто для друзей». Как водится среди любителей, на сервере замодировано все, а это влечёт за собой нестабильность работы и как следствие падения. Так как Powershell автор знает лучше, чем расположение магазинов на своей улице, он принял решение сделать «Лучший Скрипт Для Запуска Майнкрафт 2020». Этот же скрипт послужил основой для шаблона в маркетплейсе Ruvds. Но все исходники уже есть в статье. Сейчас по порядку, как это все производилось.
Нужные нам команды
Альтернативное логирование
Однажды поставив еще пару модов я обнаружил, что сервер, судя по всему, падает без объявления войны. Сервер не писал ошибки в latest.log или в debug, а консоль, которая по идее эту ошибку должна была написать и остановиться, была закрыта.
Не хочет писать – не нужно. У нас есть Powershell с командлетом Tee-Object, который берёт объект и выводит его в файл и в консоль одновременно.
Аргументы запуска
Поставив ту самую пару модов, автор заметил, что на сервере к тому же не хватает оперативной памяти. А это нужно менять аргументы запуска. Вместо того чтобы каждый раз менять их в start.bat, который все используют просто используйте этот скрипт.
Так как Tee-Object читает StandardOutput, только когда исполняемый файл вызывается «Прямо так», придется сделать еще один скрипт. Этот скрипт будет запускать сам майнкрафт. Начнем с аргументов.
Чтобы в будущем предаваться ультимативной лени, скрипт должен собирать аргументы запуска на лету. Для этого начнем с поиска последней версии forge.
С помощью sort-object мы всегда будем брать объект с самой большой циферкой, сколько бы вы туда их не положили. Ультимативная лень.
Теперь нужно назначить серверу память. Для этого берем количество системной памяти и записываем его сумму в string.
Правильный автоматический перезапуск
Сначала создадим функцию, которая будет перезапускать сервер в случае его неудачного завершения его работы.
Скрипт останется в цикле до тех пор, пока сервер из своей же консоли не завершит работу штатно, с помощью команды /stop.
Если мы все решили автоматизировать, то неплохо бы и собирать дату запуска, завершения, а также, причину завершения.
Для этого мы записываем результат Start-Process в переменную. В скрипте это выглядит так:
А дальше записываем результаты в файл. Вот что возвращается нам в переменную:
Все это с помощью Add-Content можно добавить в файл. Немного причесав, получаем такой скрипт, а на зовем его handler.ps1.
Теперь давайте оформим скрипт с запуском handler’a.
Правильная автозагрузка
Автор хочет одним модулем запускать майнкрафт различных версий из любых путей, а также иметь возможность складывать логи в конкретную папку.
Проблема заключается в том, что процесс должен запустить пользователь, который находится в системе. Это можно делать через рабочий стол или WinRm. Если запускать сервер от имени системы или даже администратора, но не входить в систему, то Server.jar не сможет даже прочитать eula.txt и запуститься.
Включить автовход в систему мы можем с помощью добавления трех записей в реестр.
Это небезопасно. Логин и пароль указываются тут плейнтекстом, поэтому под запуск сервера нужно заводить отдельного пользователя, который имеет доступ на уровне пользователя, или в еще более узкой группе. Использовать стандартного администратора для этого категорически не рекомендуется.
С автовходом разобрались. Теперь нужно зарегистрировать новую таску под сервер. Запускать будем команду из Powershell, поэтому выглядеть это будет так:
Собираем модуль
Теперь давайте оформим все в модули, которые можно будет потом использовать. Весь код готовых скриптов тут, импортируйте и пользуйтесь.
Все описанное выше вы можете использовать отдельно, если не хотите заморачиваться с модулями.
Start-Minecraft
Сначала сделаем модуль, который только и будет делать, что запускать скрипт, который будет слушать и записывать standardoutput.
В блоке параметров он запрашивает из какой папки запускать майнкрафт и куда складывать лог.
А запускать майнкрафт нужно будет так:
Теперь перейдем к готовому к употреблению Handler.ps1
Чтобы наш скрипт мог принимать параметры при вызове, также нужно указывать блок параметров. Обратите внимание, он запускает Oracle Java, если вы используете другой дистрибутив, нужно будет изменить путь до исполняемого файла.
Register-Minecraft
Скрипт, практически, повторяет Start-Minecraft, за исключением того, что только регистрирует новую задачу. Принимает те же самые аргументы. Имя пользователя, если не было указано, берет текущего.
Register-Autologon
В блоке параметров скрипт принимает параметр Username и Password. Если Username не был указан, используется имя текущего пользователя.
Запуск этого скрипта выглядит так:
Как пользоваться
Сейчас рассмотрим то, как сам автор пользуется всем этим. Как правильно нужно разворачивать публичный сервер Minecraft на Windows. Начнем с самого начала.
1. Создаем пользователя
2. Регистрируем задание по запуску скрипта
Можете зарегистрировать с помощью модуля, так:
Или воспользоваться стандартными средствами:
3. Включаем автовход в систему и перезагружаем машину
Завершение
Автор делал скрипт, в том числе и для себя, поэтому, с удовольствием выслушает ваши предложения по улучшению скрипта. Автор надеется, что весь этот код был для вас хотя бы минимально полезен, а статья интересна.
Игровое программирование. Уроки скриптописания
Для многих начинающих игростроевцев, которые уже собирают свою команду, чтобы слепить на коленке очередной шедевр, программирование часто видится жутким монстром, с которым непонятно как бороться. Вроде и в 3D уже рисовать умеют, и в Photoshop кисточкой сноровисто работают, и другие полезные программы неплохо знают. Но как только дело доходит до кода, начинается паника и неразбериха: “ Кто спрограммирует? Кто напишет заветные строчки? А если и напишет, то как в них потом разобраться?! ”.
Данный материал открывает серию статей, в которых мы на простых примерах научим вас читать с листа и писать несложный программный код. Суперкрутыми программистами вы, разумеется, не станете (для этого надо учиться значительно дольше), но иероглифы кода перестанут быть для вас чем-то непонятным, от чего нужно держаться подальше.
Установка среды разработки
Классы игры и иерархия
Распаковка игровых скриптов
Настройка среды разработки
Принципы объектно-ориентированного программирования |
Анатомия Unreal-класса |