【Node-RED】Node-RED로부터 Anaconda 가상 환경상의 Python을 실행한다【Anaconda】【Python】

하고 싶은 일


  • Node-RED에서 Python을 실행합니다.

  • 특징


  • (Python 실행 환경을 용이하게하기 위해) Anaconda 사용
  • (초학자의 장애물을 낮추기 위해) 가능한 한 사용 가능한 Node-RED 노드 활용

  • 하고 싶은 것 이미지




    1. Node-RED에서 postgreSQL에 연결하여 csv 파일 만들기
    2. Node-RED에서 bat 파일 실행
    3. bat 파일에서 conda 환경을 활성화하고 Python 프로그램을 실행합니다.
    4. Python 프로그램에 대한 I/F 파일 지정

    실행 환경


  • OS:windows 10
  • postgreSQL: 9.6
  • ANACONDA NAVIGATOR: 1.9.12
  • Python(Anaconda 가상 환경에서): 3.7.7
  • Node-RED: v1.0.4

  • 목표





    1. Node-RED에서 postgreSQL에 연결하여 csv 파일 만들기



    필요한 노드는 5개. 다음 노드는 다음 순서로 결합됩니다.
    1) 【기능】function 노드
     - 목적 : SQL 문을 조립
     - 사용법 : msg.payload에 SQL 문을 직접 기술

    function 노드에 대한 설명 이미지
    msg.select = "SELECT  val"
    msg.from = "FROM public.sensordata "
    msg.where = "where sensor ='湿度センサー'"
    msg.orderBy = "order by datetime desc"
    msg.limit = "limit 1000"
    
    msg.payload = msg.select
    msg.payload += " " + msg.from
    msg.payload += " " + msg.where
    msg.payload += " " + msg.orderBy
    msg.payload += " " + msg.limit
    
    return msg;
    

    2) 【스토리지】postgres 노드
    - 목적 : postgreSQL에 연결하여 SQL을 실행합니다.
     - 사용방법 : 표준 사용법
    3) 【기능】json to csv converter 노드
     - 목적 : postgre 노드가 json 형식으로 반환되므로 csv 형식으로 변환
     - 사용방법 : 표준 사용법
    4) 【기능】function 노드
     - 목적: 파일명 지정
    - 사용법 : msg.filename에 csv 파일의 전체 경로 지정

    function 노드에 대한 설명 이미지
    // 例)msg.rootpath = "C:\\temp\\conda"
    // 例)msg.timestampはinjectノードから取得
    msg.filename = msg.rootpath + "\\indata\\" + msg.timestamp + ".csv";
    
    return msg;
    

    5) 【스토리지】file 노드
     - 목적: csv 파일 만들기
    - 사용법 : 파일명에는 공백을 지정 (공백의 경우, msg.filename에의 설정치로 파일을 작성)


    2. Node-RED에서 bat 파일 실행



    필요한 노드는 2개. 다음 노드는 다음 순서로 결합됩니다.

    포인트


  • 실행 커멘드를 임의로 지정할 수 있도록(듯이) msg.payload에 커멘드+인수를 지정한다 (통상은 exec 노드에 커멘드를 직접 지정하지만, 그 경우 가변으로 할 수 없다) ※exec 노드의 커멘드에의 설정 값 + 공백 + msg.payload로 명령을 실행하는 것으로 보입니다

  • 1) 【기능】function 노드
     - 목적: 실행 명령어 조립
     - 사용법 : msg.payload에 실행할 명령 설정

    function 노드에 대한 설명 이미지
    // 実行するbatファイルのフルパス 例)"C:\\temp\\conda\\ExecPython.bat" ※指定したPythonプログラムを実行するbatファイルの
    msg.command = msg.execPythonCmd
    // 第1引数 例)"test.py" ※実行するPythonプログラムのファイル名
    msg.arg_1 = msg.execPythonNm
    // 第2引数 例)実行するPythonプログラムへのI/F(入力ファイル)
    msg.arg_2 = "indata\\" + msg.timestamp + ".csv"
    // 第3引数 例)実行するPythonプログラムへのI/F(出力ファイル)
    msg.arg_3 = "outdata\\" + msg.timestamp + ".csv"
    
    msg.payload = msg.command + " " + msg.arg_1 + " " + msg.arg_2 + " " + msg.arg_3
    
    return msg;
    

    2) 【기능】exec 노드
     - 목적: 명령 실행
     - 사용법 : 명령에는 공백을 지정. msg.payload의 확인란을 선택합니다.


    3. bat 파일에서 conda 환경을 활성화하고 Python 프로그램을 실행합니다.



    ExecPython.bat
    rem 実行フォルダに移動
    rem 例)C:\temp\conda 配下に実行環境が整備済の場合
    cd /d C:\temp\conda
    
    rem condaを有効にする
    call activateConda.bat
    
    rem Pythonを実行する
    rem %1:実行するPythonのファイル名
    rem %1~7:実行するPythonへの引数
    python %1 %2 %3 %4 %5 %6 %7
    

    activateConda.bat
    conda activate [有効にしたい環境名 例)base]
    

    4. Python 프로그램에 대한 I/F 파일 지정



    test.py
    import sys
    # 引数を取得する
    args = sys.argv
    
    import pandas as pd
    sensordata = pd.read_csv(args[1])
    
    print(sensordata.describe())
    sensordata.describe().to_csv(args[2], index=True)
    

    실행



    준비 1) 실행 파일 준비



    3, 4에 기재된 파일은 다음과 같이 저장된다.


    준비 2) 플로우 작성



    1, 2에 기재된 흐름을 준비한다.
    아래와 같이 실행에 필요한 정보를 function 노드에 기재하면 관리가 편할지도.
    ※「inject 노드→실행 조건 설정→1→2」의 순서로 실행하는 플로우를 작성

    실행 조건 설정
    msg.timestamp = msg.payload
    msg.rootpath = "C:\\temp\\conda"
    msg.execPythonCmd = "C:\\temp\\conda\\ExecPython.bat"
    msg.execPythonNm = "test.py"
    return msg;
    

    실행 결과



    indata 폴더에 저장된 csv 파일을 읽고 간단한 통계를 outdata 폴더로 출력


    결론



    IoT의 플랫폼으로서는 「Node-RED」, 데이터 과학의 플랫폼으로서는 「Anaconda+Python+JupyterNotebook」
    를 들 수 있을까 생각합니다만, 이것들이 심리스에 연결되면 DX가 진행되지 않을까 기대하고 있습니다.

    좋은 웹페이지 즐겨찾기