# Despliegue del marco en la cuenta de destino

* Instalar python para todos los usuarios, marcar "Add python.exe to PATH" en la instalación personalizada:
  * instalar python para todos los usuarios
  * Asociar archivos con Python (solicitar el lanzador "py")
  * Crear accesos directos para aplicaciones instaladas
  * Agregar Python a las variables de entorno
  * Precompilar la biblioteca estándar
* Crear una tarea en el programador de tareas de Windows con cualquier nombre General:

  * "Ejecutar solo para usuarios que hayan iniciado sesión"

  Disparadores:

  * "Al iniciar sesión" --> "Usuario" (especificar)
  * "Al conectarse de forma remota" --> "Conexión desde un equipo remoto" --> "Usuario" (especificar)

  Acciones:

  * "Iniciar programa"
  * "Programa o script" --> Ruta completa a SherpaPython.exe
  * "Carpeta de trabajo" --> Ruta a la carpeta donde se encuentra SherpaPython.exe, obligatoriamente sin comillas, ejemplo: D:\Sherpa\_RPA\PythonSherpa-framework\\
* Ejecutar manualmente SherpaPython.exe una vez
* Los registros del marco se ubicarán en la ruta C:\Users\User\AppData\Roaming\Sherpa RPA Python
* El archivo de configuración settings.txt se ubicará en la ruta C:\Users\User\AppData\Roaming\Sherpa RPA Python

Contenido de settings.txt

* << Ingrese el guid del robot >> - reemplazar por el GUID del robot
* << Ingrese el host del robot >> - ingresar el host o IP del orquestador junto con el protocolo, por ejemplo <https://orchestrator2.sherparpa.ru>
* << Ingrese el estado de logoff del robot >> - un número (0 - no se realiza logoff automático al finalizar trabajos, 1 - se realiza logoff automático al finalizar trabajos, si no hay tercera línea se considera que el valor establecido es 1)

***

```
                    RobotsOrcFramework
```

***

```
Manejo de la parada suave dentro del robot python

import signal
import time
import sys

class TestProcess1():
    stop = False
    def __init__(self):
    # Captura de la señal de parada suave del marco
        signal.signal(signal.SIGBREAK, self.stop_process)

    # Manejo de la señal en forma de cambio de bandera
    def stop_process(self, signal, frame):
        self.stop = True 

    def robot_work(self):
        for elem in range(10):
            time.sleep(1)
            # Si la bandera está en la posición correcta, interrumpir el programa
            if self.stop:
	    sys.exit()

test = TestProcess1()
test.robot_work()
```

***

```
Obtener y procesar argumentos del marco dentro del robot python

# procesar argumentos de la línea de comandos
def process_cmd_arguments(argv):
    process_version_guid = argv[0]
    job_guid = argv[1]
    settings_path = argv[3]

process_cmd_arguments(sys.argv[1].split("|"))
```

***

```
Obtener host y GUID del robot dentro del robot python

# obtener configuraciones
def get_settings():
    with open(settings_path, "r", encoding="utf-8") as file:
        settings = file.read()
    settings = [elem.replace("\n", "") for elem in settings.split("\n")]

    return settings[0], settings[1]

robot_GUID, host = get_settings()
```

***

```
Ruta a los scripts python de los robots

En el nombre de la versión del proceso en el orquestador, especificar la ruta al script python,
relativa al archivo del marco (RobotsOrcFramework.py)

Formato
carpeta1\carpeta2\nombre del script sin extensión
```

***

```
                    Uso de TaskOrchestratorAPI
```

***

```
from TaskOrcAPI import TaskOrchestratorAPI # carpeta OrchestratorAPI
TOA = TaskOrchestratorAPI(robot_guid, host, headers)
```

***

```
Agregar tarea a la cola

param_task se puede omitir, por defecto {"":""}
name se puede omitir, por defecto "NewTask"

queue_GUID = "f96b549d-bc58-48b9-ba78-463692c7680b"
param_task = {"param1": "1", "param2": "2", "param3": "3"}
name = 'New Task'

result = TOA.add_task(queue_GUID)

result['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
```

***

```
Obtenemos tarea de la cola

status, se puede omitir, por defecto 0

queue_GUID = "f96b549d-bc58-48b9-ba78-463692c7680b"
status = 1

result = TOA.get_task(queue_GUID, status)
result_dict = json.loads(result.text)

result                       # <Response [200]> Código de la solicitud

result_dict['id']            # 1171
result_dict['guid']          # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
result_dict['name']          # NewTask
result_dict['status']        # 4
result_dict['created']       # 2022-10-28 06:19:19
result_dict['updated']       # 2022-10-28 09:45:45
result_dict['comment']       # comentario
result_dict['priority']      # 1
result_dict['deadline']      # 2022-10-28 06:19:19
result_dict['postponed']     # 2022-10-28 09:45:45
result_dict['parameters']    # {"param": "value"}
result_dict['description']   # None
```

***

```
Actualizamos el estado de la tarea obtenida anteriormente

Directorio de estados de tareas
STATUS_NEW              = 0;  # Nueva tarea
STATUS_IN_PROGRESS      = 1;  # Tarea en progreso
STATUS_SUCCESS          = 2;  # Tarea completada con éxito
STATUS_FAILED           = 3;  # Tarea fallida con Exception de Aplicación
STATUS_FAILED_BUSINESS  = 4;  # Tarea fallida con Exception de Negocio
STATUS_POSTPONED        = 5;  # Tarea pospuesta hasta el tiempo indicado
STATUS_ABANDONED        = 6;  # Tarea abandonada (no procesada a tiempo)

status, se puede omitir, por defecto 0    

task_GUID = '4e9cb924-681a-4d1d-9420-e1dac677f3fa'
status = 5

result = TOA.update_task_status(task_GUID, status)
result # <Response [200]> Código de la solicitud
```

***

```
Obtenemos recurso (asset)

asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"

result = TOA.get_asset(asset_GUID)

result['id']                # 1171
result['guid']              # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
result['name']              # Recurso
result['text']              # 4
result['type']              # 1
result['created']           # 2022-10-28 06:19:19
result['updated']           # 2022-10-28 06:19:19
result['robot_id']          # None
result['password']          # 2022-10-28 06:19:19
result['is_deleted']        # 0
result['account_id']        # 27
result['robot_type']        # 3
result['description']       # ''
result['robot_group_id']    # None
```

***

```
Actualizamos el recurso

name se puede omitir, por defecto NewName
si el recurso son credenciales (credentials), indicamos password, entonces text = username, de lo contrario no se indica

asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"
text = 'Nuevo recurso'
name = 'Recurso'
password = '777'

result = TOA.asset_update(asset_GUID, text, name, password)
result # <Response [200]> Código de la solicitud
```

***

```
Agregamos una nueva entrada al registro

Valores permitidos para Level: 'Info', 'Critical', 'Error', 'Warning', 'Debug'

level se puede omitir, por defecto 'Info'
message se puede omitir, por defecto ''

robot_guid = sys.argv[1]
process_version_guid = 'f7952815-a238-4870-b678-943b0119d0f4'
job_guid = '922d3cc6-99ec-44c2-b0a0-62114c9d2908'
level, message = 'Info', 'mensaje'

result = TOA.add_new_log_entry(
    robot_guid, process_version_guid, job_guid
)
result_dict = json.loads(result.text)

result                  # <Response [200]> Código de la solicitud
result_dict['guid']     # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
```

***


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sherparpa.ru/es/sherpa-rpa/sherpa-orchestrator/python-sherpa-framework/razvertyvanie-freimvorka-na-celevoi-uchetnoi-zapisi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
