diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 9b3747a..85730e8 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -46,7 +46,7 @@ jobs: - name: Create zip uses: papeloto/action-zip@v1 with: - files: src/ManageAppProjects readme.pdf readme.md update_config_before_install.yml update_config_after_install.yml + files: src/ManageAppProjects readme.pdf readme.md update_config_before_install.yml update_config_after_install.yml script_example.py dest: ManageAppProjects.zip recursive: true - name: Upload release.zip diff --git a/readme.md b/readme.md index a85e3ab..446e394 100644 --- a/readme.md +++ b/readme.md @@ -619,3 +619,46 @@ do map check_sdk ``` Проверить наличие и соответствие версий для git и dotnet. + +### run_script - запустить python-скрипт в контексте DirectumLauncher + +``` +do map run_script --script_filename=script_example.py +``` + +Позволяет запустить внешний python-скрипт в контексте DirectumLauncher. + +В скрипте будет доступны: + +* все импортированные в map_installer.py функции, модули +* предопределенная переменная self_map - ссылка на экземпляр класса ManageAppliedProject, через который вызывается команда `run_script`. +* дополнительные параметры, которые будут доступны в коде скрипта в качестве локальных переменных. Пример вызова скрипта с доп.параметрами: + +``` +do map run_script --script_filename=script_example.py --arg1=value1 --arg2=value2 +``` + +В файле script_example.py приведен пример скрипта, демонстрирующий некоторые возможности, доступные в скриптах. + +``` +# отобразить доступные локальные переменные +log.info(pformat(locals())) + +# проверить передан ли параметра arg1 +if "arg1" not in locals(): + log.error("Пропущен обязательный параметр arg1") + sys.exit(-1) + +# вывести значение параметра arg1 +log.info("Параметры запуска:") +log.info(f' arg1={arg1}') + +# отобразить путь к config.yml текущего экземпляра RX +log.info(f'Путь к config.yml: {self_map.config_path}') + +# вызвать метод класса ManageAppliedProject +self_map.check_sdk(need_pause=False) + +# вызвать функцию, определенную в map_installer.py +log.info(f'Версия RX: {_get_rx_version()}') +``` diff --git a/readme.pdf b/readme.pdf index 2e2ed3d..af7a190 100644 Binary files a/readme.pdf and b/readme.pdf differ diff --git a/script_example.py b/script_example.py new file mode 100644 index 0000000..a976a4f --- /dev/null +++ b/script_example.py @@ -0,0 +1,20 @@ +# отобразить доступные локальные переменные +log.info(pformat(locals())) + +# проверить передан ли параметра arg1 +if "arg1" not in locals(): + log.error("Пропущен обязательный параметр arg1") + sys.exit(-1) + +# вывести значение параметра arg1 +log.info("Параметры запуска:") +log.info(f' arg1={arg1}') + +# отобразить путь к config.yml текущего экземпляра RX +log.info(f'Путь к config.yml: {self_map.config_path}') + +# вызвать метод класса ManageAppliedProject +self_map.check_sdk(need_pause=False) + +# вызвать функцию, определенную в map_installer.py +log.info(f'Версия RX: {_get_rx_version()}') \ No newline at end of file diff --git a/src/ManageAppProjects/map_plugin/map_installer.py b/src/ManageAppProjects/map_plugin/map_installer.py index 3a4744c..8f2a7b4 100644 --- a/src/ManageAppProjects/map_plugin/map_installer.py +++ b/src/ManageAppProjects/map_plugin/map_installer.py @@ -1212,6 +1212,26 @@ def check_sdk(self, need_pause: bool = False) -> None: if need_pause or need_pause is None: pause() + def run_script(self, script_filename: str, *args: Any) -> None: + """Запуск python-скрипта + + Args: + script_filename: путь к запускаемому файлу + *args: дополнительные параметры, которые будут переданы в запускаемый скрипт в виде переменных + + """ + with open(_get_check_file_path(script_filename), 'r', encoding='utf-8') as f: + script = f.read() + args_dict = {} + for arg in args: + sep_ids = arg.find('=') + if sep_ids != -1: + args_dict[arg[:sep_ids]] = arg[sep_ids+1:] + # передать ссылку на экземпляр класса в качестве предопределенной переменной + args_dict["self_map"] = self + + exec(script, globals(), args_dict) + @staticmethod def help() -> None: log.info('do map set - переключиться на проект, описаный в указанном yml-файла') @@ -1231,5 +1251,6 @@ def help() -> None: log.info('do map url - показать url для подключения к веб-клиенту текущего инстанса') log.info('do map check_config - показать ключевую информацию из указанного yml-файла описания проекта') log.info('do map check_sdk - проверить наличие необходимых компонент git и .Net') + log.info('do map run_script - запустить python-скрипт') #endregion