굉장히 드문 경우지만 IP Block 등을 막기 위해서 RPA 과제 진행 중 Proxy를 사용하는 케이스가 있다.

그 경우 지금 VPN이 돌고 있는지 아닌지를 알기 위해 기존 원래 공인 IP를 확인하고

특정 시점에 공인 IP를 확인하는 로직이 필요하다.

 

네이버에 '내 아이피 찾기' 이런 식으로 쳐도 나오지만,

RPA에서 가장 부담이 적은 방법은

Invoke Power shell에서 "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()"를 실행하는 것이다.

기본 Text Command를 하드 코딩하는 경우의 설정

 

output은 Collection 객체이고 하나의 요소가 Return 된다. (= 공인 IP 주소)

 

 

오개념이 좀 있을 수 있지만 대략적인 느낌만 참고 바랍니다.

+ 기억을 다시 되돌려보니 트리거를 걸 때 specific robots를 체크하면 environment를 굳이 바꾸지 않아도 됐던 거 같은데

단톡 질문하신 분 참고해 보세요~

자주 헷갈려서 남겨둔다.

Try~Catch~Finally에서 Catch 에러가 나면 xaml의 Error Handler로 가게 된다.

따라서 Finally 구문은 실행되지 않는다.

Try에서 Terminate Workflow를 쓰면 바로 이렇게 되게 할 수 있다.

[Catch문도 안 탐]

일반적으로 다른 언어에서도 Catch문에서 에러가 나면 Finally는 실행되지 않고 에러로 처리된다.

다만 파이썬은 Finally가 실행된다. [각주:1]

  1. 이래서 Finally를 금지하는 경우도 있다. [본문으로]

https://docs.uipath.com/robot/docs/arguments-description

 

Arguments Description

To make it easier for you to work with command line arguments, navigate to the directory in which the Robot is installed using the change directory command. For example, if you did not change the default location of the Robot, you can use the following com

docs.uipath.com

 

i) 오케스트레이터에 연결되어 패키지화 된 경우

-p 또는 --process <오케스트레이터상 매핑된 process 이름>

예 : UiRobot.exe execute -p UiPathDemoProcess

이렇게 올리면 작업 스케줄러(AR봇)로 실행하더라도 오케스트레이터에서 해당 수행의 로그를 실시간으로 확인할 수 있습니다.

 

ii) 오케스트레이터에 연결되지 않고, 파일 자체를 실행해야 하는 경우

 

일반적으로 오케스트레이터를 구매하지 않았을 때, AR에서의 방식입니다. [ex) 항공 DSR 배치 업로드 과제]

-f 또는 --file <로컬 파일 경로>

예 : UiRobot.exe execute --file "C:\UiPath\Automation\Project.json"

 

iii) 인수를 전달해야 하는 경우

--input <JSON 형태의 input parameter key-value>

예 : UiRobot.exe execute --process UiPathDemoProcess --input "{'i_sArg' : 'value' , 'i_iNumber' : 3, 'i_arrOffice' : ['본점', '지점']}"

iv) 폴더를 지정해야 되는 경우

--folder <폴더이름>

예 : UiRobot.exe execute --process UiPathDemoProcess --input "{'i_sArg' : 'value' , 'i_iNumber' : 3, 'i_arrOffice' : ['본점', '지점']}" --folder 회사이름

 

추가 TIP

+ bat 파일을 통해 실행시키는 경우 해당 파일은 ANSI 인코딩으로 저장해야 한글 인수를 전달해도 깨지지 않습니다.

+ 폴더이름은 한글이어도 상관없고, 프로세스 이름 및 폴더명은 띄어쓰기가 들어가지 않는 이상 ""을 씌우지 않아도 됩니다.

+ argument가 boolean값인 경우 소문자로 적어야 합니다. true, false

1. 실행 패턴

기본적으로 로컬의 PVM 기반으로 실행을 한다.

따라서 실행될 Device의 로컬에 python은 설치해 주어야 하며, 필요한 패키지도 미리 설치해줘야 한다.

(혹은 패키지 관리툴의 설정파일을 뿌려놓을 수도 있긴 하다. 없으면 설치하고 진행할 수 있게.)

++ 보통 안 되는 경우 파이참과 같은 인터프리터 환경이 아닐 가능성이 높습니다. 환경과 패키지를 먼저 확인해 보세요~

  1) PVM 위치(파이썬 위치) 지정

  2) 소스 불러오기

  3) 함수 및 파라미터 지정 및 실행

  4) Get Return Value

 

1)의 과정은 Python Scope으로 지정한다.

C:\Users\{Username}\AppData\Local\Programs\Python\PythonXX (XX는 파이썬 버전. 3.8이면 38)

2)는 Load Python Script로 실행한다.

2)의 과정은 소스를 불러와서 실행하기 위한 파이썬 객체를 생성한다.

 

3)에서는 2)에서 얻은 파이썬 객체, 파라미터 , 함수 이름을 넣는다.

함수에 파라미터가 있다면 Array 형태로 순서대로 넣어준다.

그리고 역시나 결과를 담은 파이썬 객체를 리턴한다.

다만 이 객체에 있는 정보를 가져오려면 Get Python Obejct를 써서 Output으로 받아야 한다.

 

대략적으로 이런 패턴이 된다.

다만 디버깅은 파이참에서 하는 게 낫다.

에러가 나면 pipe is broken 같은 메시지가 뜨면서 뭐가 잘못된 건지 알기 어렵다.

아니면 파이썬에 Try Catch를 잘 구성해서 에러메시지를 잘 받아오자.

(어차피 파이썬에서는 데이터 처리만 해야지 프로세스가 복잡해져선 관리가 어렵다.)

 

2. 리턴

리턴은 사실 안 받을 수도 있고 파일 결과물을 확인할 수도 있다.

파이썬에서 작업하면 JSON으로 가져오고 그걸 Uipath에서 가장 많이 쓰는 Datatable로 가져오면 편한데

DataFrame과 DataTable간 Convert를 어떻게 하느냐가 문제다.

성능적으로 좋은 방법인지는 모르겠지만[각주:1]

내가 썼던 방법은 파이썬에서 JSON으로 주고,

DataTable 형태로 구성된 JSON을 다시 Uipath에서 Datatable로 Convert하는 방식이다.

그럼 파이썬에서 Dataframe을 JSON으로 변경해야 하는데

str_json = df.to_json(orient='records', force_ascii=False)

이런 형태로 변경하면 된다.

결정적으로 Dataframe은 Columnal 데이터인 series로 이뤄져 있기 때문에

JSON으로 그냥 바꾸면 datatable로 변형하기 어려운 형태가 된다.

이때 records 단위로 convert하면 Uipath의 Datatable로 쉽게 바뀌는 구조가 된다.

[force_ascii는 인코딩 때문에 false로 줌]

 

 

 

------- 주의 사항 -------

애초에 파이썬 코드를 자동화, 배치 실행하는 관리 툴로서 RPA를 권장하지는 않습니다.

디버깅도 다른 툴에서 해야 되거니와 이런 배치가 늘어난다면, 더 효율적인 무료툴과 OS가 있기 때문이죠.

[airflow같은 workflow management툴 등, OS는 우분투 등등]

파이썬 코드 자동화는 RPA에 대부분 어울리지 않습니다.

기존의 코드가 있는 경우 활용하려고 하면 어느 정도는 맞을 수 있겠네요

 

  1. 사실 그 정도로 퍼포먼스를 신경써야 한다면 Uipath로 하는 걸 추천하지 않는다. [본문으로]

대전제

모든 컨설팅은 결국 좋은 프로세스를 만드는 데 목적이 있고

좋은 프로세스는 직관적, 효율적이면서 목표 기간간 충분히 지속가능하다는 특성을 가진다.

 

--------------------------------------------------------------------------------------------------------

제1원칙

이때 RPA가 추구하는 1차 목표는 안정성이며 2차로 퍼포먼스이다.

1차 안정성 보장한 후 설계를 하고, 그런 설계로 인한 예상 소요시간이 수용 가능한지 체크해야 한다.

 

제2원칙

필수와 선택을 명확히 구분해야 한다.

요구사항에서 '필수'인 것과 '되면 더 좋은 것(선택)'을 구분해야 이것을 어떻게 처리할지 판단이 된다.

보통은 요구사항에서 들어오면 필수로 인식해서 무조건 이걸 성공시켜야 된다 생각하고 필수로직과 같이 태우기 십상인데

결국 선택적 영역에서 오류가 나서 필수 프로세스가 진행되지 못하는 케이스가 많다.

특히 이런 케이스가 잦은 이유는 요구사항을 내는 주체가 대부분 상대적으로 선택적 영역에 관심이 덜하기 때문이다.

 

제3원칙

RPA로 컨트롤 할 수 있는 것과 없는 것을 구분해야 한다.

컨트롤 할 수 있는 것에는 '대응'이 필요하고, 없는 것에는 'Exception'이 필요하다.

이에 따라 디버그를 할 때도 '대응'이 실패했는지, 'Exception'처리에 실패했는지를 구분할 수 있게 설계해야 한다.

 

제4원칙

직접 인식이 어려울 땐 돌아갈 수 있어야 한다.

https://jnaul.tistory.com/303

 

[RPA] 설계와 개발을 쉽게 하기 위한 Proxy 연상

설계와 개발을 하다보면 바로 정보를 가져올 수 없거나 인식 기점을 직접적으로 가져올 수 없는 경우가 있다. 혹은 직접적으로 가져오는 경우 예외 케이스가 많아지는 경우도 있다. 그 경우 Proxy

jnaul.tistory.com

 

현상 : AR인 곳에서 batch 파일이나 스케줄러를 통해 프로세스를 실행시키고자 할 때 발생. 이벤트 뷰어에서 "Please provide the Folder Path for process" 라는 문구가 뜸

원인 : 오케스트레이터 다른 폴더내에 같은 프로세스명이 있어 어떤 걸 실행시킬지 판단 불가

조치 : 오케스트레이터 폴더 path를 인수로 주거나 겹치는 프로세스를 삭제

https://docs.uipath.com/robot/docs/arguments-description

 

Arguments Description

To make it easier for you to work with command line arguments, navigate to the directory in which the Robot is installed using the change directory command. For example, if you did not change the default location of the Robot, you can use the following com

docs.uipath.com

예시 : UiRobot.exe execute --process UiPathDemoProcess --folder OrchFolder1 --input "{'inArg' : 'value' , 'Integer' : 3}"

조건문을 쓰다 보면 And와 Or를 자주 쓰게된다.

그러나 항상 불편한 점이 있다.

ex) dtContainer isnot nothing AND dtContainer.rows.count > 0

예시와 같은 조건을 걸면 dtContainer가 Nothing인 경우에 에러가 난다.

Nothing인 DataTable에 .rows라는 메서드를 적용할 수 없기 때문이다. (NullpointException)

물론 이런 경우 미리 build data table을 해서 테이블 기본 할당을 해놓고 row만 체크할 수도 있다.

하지만 이는 개발관점에서도 비효율적이고 프로세싱에서도 손해가 있는 방법이다.

 

첫번째 조건이 False일 때, AND로 이어진 구문은 더이상 검사할 필요가 없다

마찬가지로 Or로 이어진 구문도 앞에 나온 조건이 True면 Or 뒤에 구문은 볼 필요가 없다.

Uipath에서 이런 기능을 해주는 것이 AndAlso, OrElse라고 한다.

[파이썬에서는 And, Or만 있고 이게 기본적으로 AndAlso, OrElse의 기능을 함]

 

따라서 And와 Or는 항상 AndAlso, OrElse에 비해 어떤 상황이든 효율적이지 않다.

앞으로는 개발 시에 AndAlso, OrElse로 바꿔적으려고 한다.

+ Recent posts