Window batch 파일을 Python 에서 동작해보기

김재만·2024년 3월 25일
0

알쓸개잡

목록 보기
3/9
post-thumbnail

🤔 window batch 파일

window OS 를 사용하다보면 다음과같은 파일들은 자주 보게됩니다. 저희가 비록 몰라도 되지만 만약 exe 실행파일을 개발해서 해당 실행파일에 메모장과 같은 데이터를 넣어 결과를 받아야 한다면 어떻게 될까요??

저는 실제로 이러한 경험을 겪게되었습니다. 당연히 DB 에 데이터를 저장해두고 필요한 데이터만 꺼내서 프로그래밍 해서 쓰면 되는거 아니야? 라고 하실 수 있지만 아니었습니다.. 데이터가 실제로 엑셀, 메모장등으로 실무자의 PC에서만 관리 되는 것도 보았고 (내부망이기에 보안은 괜찮겠지만..) 데이터 처리를 할 때 누군가 먼 옛날 다른 개발자가 만들어 둔듯한 exe 실행 파일을 실행시켜 한땀한땀 input 데이터를 입력하며 진행하는 것도 보았습니다.

그렇게 저는 db 구축은 제 권한외기에 어렵지만 내부망 pc에서 python anaconda 를 가져와 설치하고 window OS 상에서 batch 파일들을 만들고 python코드로 구현 해보았습니다.

👀 Python 에서 window batch 파일 돌려보기

기본적으로 python 에서 os 에 접근해서 쉘스크립트나 쉘 명령어를 동작하려고하면 크게 os, subprocess 라이브러리를 사용하여 동작한다. 내가 subprocess 라이브러리를 사용한 이유는 os.systemp 명령어에선 성공 유무만 알려줄 뿐 결과를 변수에 저장할 수는 없었다. 나는 추가적으로 해당 결과를 가지고 작업을 진행할 수도 있기에 변수에 저장해서 관리할 수 있도록 subprocess 라이브러리를 사용하였다.
(간단하게 폴더 생성, 조회 등은 os 라이브러리가 더 간단하여 해당 라이브러리를 사용하였다.)

import shutil
import subprocess
import time


try:
	_NEED_FIELS = ['Mep.exe', 'test.bat', 'test2.bat']
	f1 = os.listdir('./')

	for filen in _NEED_FIELS:
		if not filen in fl:
			print("Mep.exe, test.bat, test2.bat 파일이 존재하지않습니다.")
        else:
        	shutil.copy(f'./{filen}', f'./output/{_TITLE}/')
    else:
    	commands = ['test.bat', 'test2.bat']
        path_to_directory = f'output/{_TITLE}'
        for command in commands:
        	time.sleep(1)
            proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, cwd=path_to_directory)
            time.sleep(1)

			if proc.stdout:
            	for po in proc.stdout:
                	print(po)
            else:
            	for pe in proc.stderr:
                	print(pe)
 except:
 	print("error: [에러코드]")

💡 느낀점

아르바이트 형태지만 개발자가 없는 곳에서 실무자들과 이야기하며 단순 반복 업무를 자동화하여 효율적으로 업무를 진행하다보니 재밌는 일이 많은 것 같습니다. AWS 서버에 db 구축까지해서 제대로 업무를 하고 싶지만 그렇게 할 수 없는 점이 아쉬웠고, 실제 실무자분들께서 외주로 맡긴 db 운영 해주는 업체는 단순한 자료 변경 요청(db 테이블이 2개라던데..)마저도 어렵다, 바쁘다, 본사를 통해 말해달라 등 어려움이 많은 것 같고 db 에 직접 붙을 수 있는 권한도 없다고하니 안타까웠다..

물론 좋은 개발자분들도 너무 많지만, 개발자분들은 비개발자분들과의 커뮤니케이션 능력도 중요한 능력인 것 같다고 느끼게 되는 계기였다.

🔭 전체코드

import xlwings as xw
import pandas as pd
import os
import shutil
import subprocess
import time


def GetDataFrame(file_name, sheet_num=1):
	wb = wx.Book(file_name)
    s = wb.sheets(sheet_num).used_range.value
    data = pd.DataFrame(s)
    data = data.dropna(how='all', axis=1)
    data = data.dropna(how='all', axis=0)
    return data
    
    
def CheckInputFiles(s):
	folder_path = f'./{s}'
    
    file_names = os.listdir(folder_path)
    
    result = []
    
    for fn in file_names:
    	if not fn[:2] == "~$":
        	result.append(fn)
    
    return result


if __name__ == '__main__':
	try:
    	fn_list = CheckInputFiles("input")
        
        for idx in range(len(fn_list)):
            fn = fn_list[idx]
            df = GetDataFrame(f"./input/{fn}", 1)
            
            # 타이틀 설정
            _TITLE, _ = fn.split(".")
            _TITLE = "2023_" + _TITLE
            
            # 추출할 ROW 범위 설정
            start = 4
            end = CheckRange(start, df)
            _ROW_RANGE = [i for i in range(start,end)]
            
            # 폴더 명
            folder_path = f"./output/{_TITLE}"
            
            if os.path.exists(folder_path):
            	result = input("현재 해당 폴더가 이미 존재합니다. 덮어 씌워 작성하시겠습니까? (Y/N)"
            else:
            	result = "Y"
               
            if result == "Y":
            	try:
                	os.makedirs(folder_path, exist_ok=True)
                    print("폴더 생성")
                    MakeUFiles() # 엑셀자료 정리하는 함수 블로그에선 따로 정의하지 않음
                    try:
                    	_NEED_FIELS = ['Mep.exe', 'test.bat', 'test2.bat']
                        f1 = os.listdir('./')
                        
                        for filen in _NEED_FIELS:
                        	if not filen in fl:
                            	print("Mep.exe, test.bat, test2.bat 파일이 존재하지않습니다.")
                            else:
                            	shutil.copy(f'./{filen}', f'./output/{_TITLE}/')
                        else:
                        	commands = ['test.bat', 'test2.bat']
                            path_to_directory = f'output/{_TITLE}'
                            for command in commands:
                            	time.sleep(1)
                                proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, cwd=path_to_directory)
                                time.sleep(1)
                                
                                if proc.stdout:
                                	for po in proc.stdout:
                                    	print(po)
                                else:
                                	for pe in proc.stderr:
                                    	print(pe)
                    except:
                    	print("error: [에러코드]")
                except:
                	print("error: [에러코드]
            else:
            	print("작업이 취소되었습니다.")
        
        print("모든 작업이 완료되었습니다.")
                                    
	except:
    	print("error: [에러코드]")
profile
기록으로 남기고 공유를 위한 벨로그입니다.

0개의 댓글