728x90

결국 구글링으로 해결책을 찾았습니다. 이 방법은 pyinstaller가 패키징을 할 때 UI파일을 수동으로 포함하도록 지정해 주는 방법으로 UI파일이 2개 이상인 경우에도 사용할 수 있는 유용한 방법입니다.

먼저 파이썬 스크립트는 처음 구상했던 대로 실행 위치를 기준으로 UI파일의 절대 경로를 찾아서 실행할 수 있도록 만들어 줍니다.

PYTHON
import os

## python실행파일 디렉토리
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 
Ui_MainWindow, QtBaseClass = uic.loadUiType(BASE_DIR + r'\GUI.ui')

class MyWindow(QMainWindow):
​​​​def __init__(self):
​​​​​​​​super(MyWindow, self).__init__()
​​​​​​​​self.ui = Ui_MainWindow()

이렇게 되면 스크립트 실행 상태에서는 문제없지만 패키징 상태에서는 문제가 되죠. 그래서 이제 패키징에 UI파일을 포함시키기 위해서 아래 과정을 추가로 진행합니다.

pyinstaller.exe -w -F .\MyCode.py

일단 스크립트를 pyinstaller로 한번 패키징 합니다. 이때 최종 결과에 반영할 옵션을 걸어서 실행합니다. 저는 커맨드 창을 숨기고(-w) 하나의 파일로(-F) 패키징을 하도록 했습니다. 이렇게 하고 나면 실행파일(.exe)도 만들어지지만 작업 폴더에 보면 ".spec"이라는 확장자의 파일이 만들어져 있습니다. (예: MyCode.spec)

pyinstaller가 작업을 하는데 필요한 각종 설정이 저장된 파일인데요. 이 파일을 열어서 아래 그림처럼 수정해 줍니다. Analysis(datas) 부분이 UI 과련 리소스를 지정하는 부분인데 여기에 UI파일을 명기하면 됩니다. 

그리고 또 하나 유용한 게 만약 UI파일이 여러 개인 경우라면 대괄호 안에 리스크 형태로 포맷을 맞춰서 추가할 파일을 더 써주면 됩니다.

이렇게 수정했으면 이 .spec파일을 이용해서 다시 한번 패키징을 해 줍니다.

pyinstaller.exe .\MyCode.spec

이때는 앞서 사용했던 -w -F 옵션이 이미 .spec파일에 반영되어 있기 때문에 다시 지정할 필요는 없습니다.

이렇게 하면 UI파일이 패키징에 포함되어서 하나의 파일만으로도 GUI 프로그램이 잘 실행됩니다. UI파일 2개도 해봤는데 잘 되네요.

728x90

'파이썬+VBA' 카테고리의 다른 글

판다스 dataframe 속 pandas timestamp  (0) 2022.09.22
데이터프레임 역순 정렬  (0) 2022.09.22
파이썬 기본기본  (0) 2022.09.07
왜 집에선 안되니...pdftoexcel  (0) 2022.09.07
메모장 문자열을 역순으로 재 정렬  (0) 2022.09.06
728x90

pip를 이용한 특정 버전 패키지 설치 명령어는 아래와 같다.

pip install [package_name]==[package version]

특정 패키지를 업데이트 하는 경우의 명령어는 아래와 같다.

pip install --upgrade [package_name]

특정 패키지를 특정 버전으로 업데이트 하는 경우는 아래와 같다.

pip install --upgrade [package_name]==[package version]

예시

pip install --upgrade scikit-learn==0.22.1

특정 버전 업데이트를 하는 경우는 굳이 --upgrade없이 아래와 같이 사용해도 된다.

예시

pip install scikit-learn==0.22.1

실행파일만들기 

pyinstaller --noconsole --onefile test.py

728x90
728x90

from tkinter import *
from tkinter.filedialog import *
import pandas as pd
import xlrd
import re

file = "C:\\Users\\htsnote\\Desktop\\pypy\\juju\\삼보.xlsx"
#file = "C:\\Users\\htsnote\\Desktop\\pypy\\juju\\아세아제지.xlsx"
xls = xlrd.open_workbook(file, on_demand=True)
nsheets = xls.nsheets  # 179개

#목차 확인.
table_of_contents = pd.read_excel(file, sheet_name="Page1").fillna(0)
all_table_of_contents = table_of_contents.values

for i in range(len(all_table_of_contents)):
    if "주식의 총수" in all_table_of_contents[i][0]:
        str_num_of_stock = all_table_of_contents[i][0]
        #print(str_num_of_stock)
        for j in range(len(str_num_of_stock)-1,0,-1):
            if str_num_of_stock[j] == ".":
                tag_num_of_stock = j + 1
                break
        page_num_of_stock = int(str_num_of_stock[tag_num_of_stock:])
    elif "배당에 관한 사항" in all_table_of_contents[i][0]:
        str_allocation = all_table_of_contents[i][0]
        for j in range(len(str_allocation)-1,0,-1):
            if str_allocation[j] == ".":
                tag_allocation = j + 1
                break
        page_allocation = int(str_allocation[tag_allocation:])
    elif "주주에 관한 사항" in all_table_of_contents[i][0]:
        str_juju = all_table_of_contents[i][0]
        for j in range(len(str_juju)-1,0,-1):
            if str_juju[j] == ".":
                tag_juju = j + 1
                break
        page_juju = int(str_juju[tag_juju:])
    elif "임원 및 직원 등의 현황" in all_table_of_contents[i][0]:
        str_employee = all_table_of_contents[i][0]
        for j in range(len(str_employee)-1,0,-1):
            if str_employee[j] == ".":
                tag_employee = j + 1
                break
        page_employee = int(str_employee[tag_employee:])
    elif "임원의 보수" in all_table_of_contents[i][0]:
        str_ceo = all_table_of_contents[i][0]
        for j in range(len(str_ceo)-1,0,-1):
            if str_ceo[j] == ".":
                tag_ceo = j + 1
                break
        page_ceo = int(str_ceo[tag_ceo:])
    

flag_num_of_stock = 0 #주식의 총수 
flag_allocation_per = 0 #배당성향
flag_allocation_won = 0 #배당금
flag_juju = 0 #주주관한 사항
flag_employee = 0 #직원 등 현황
flag_ceo = 0 #임원의 보수

#1.주식의 총수
for p in range(page_num_of_stock, page_num_of_stock+3): #pdf페이지와 엑셀 페이지가 2page정도 차이남.. 이것도 여러게 확인필요
    page = 'Page' + str(p)
    readXL = pd.read_excel(file, sheet_name=page).fillna(0)
    readXL = readXL.values
    for i in range(len(readXL)):
        # if readXL[i][0] in ["Ⅳ. 발행주식의 총수 (Ⅱ-Ⅲ)"]:
        if "발행주식의 총수" in str(readXL[i][0]):
            flag_num_of_stock = 1
            print(readXL[i])
            print(readXL[i][3])
            break
        elif "작성기준지침에 따라 분기보고서에는 기재하지 않습니다" in str(readXL[i][0]):
            flag_num_of_stock = 1
            print(readXL[i])
            print(readXL[i][0])
            break
        elif "작성기준지침에 따라 반기보고서에는 기재하지 않습니다" in str(readXL[i][0]):
            flag_num_of_stock = 1
            print(readXL[i])
            print(readXL[i][0])
            break
    if flag_num_of_stock == 1:
        break
#2.배당에 관한 사항
for p in range(page_allocation, page_allocation+3):
    page = 'Page' + str(p)
    readXL = pd.read_excel(file, sheet_name=page).fillna(0)
    readXL = readXL.values
    for i in range(len(readXL)):
        if "현금배당성향" in str(readXL[i][0]):
            flag_allocation_per = 1
            print(readXL[i])
            print(readXL[i][3])
            break
    for i in range(len(readXL)):
        if "주당 현금배당금" in str(readXL[i][0]):
            flag_allocation_won = 1
            print(readXL[i])
            print(readXL[i][3])
            break
    if flag_allocation_per == 1:
        break
    elif flag_allocation_won == 1:
        break

#3. 주주에 관한 사항
for p in range(page_juju, page_juju+3):
    page = 'Page' + str(p)
    readXL = pd.read_excel(file, sheet_name=page).fillna(0)
    readXL = readXL.values
    for i in range(len(readXL)):
        if "계" in str(readXL[i][0]) and "보통주" in str(readXL[i][1]) :
            flag_juju = 1
            if type(readXL[i][-2]) is float:
                print(readXL[i])
                print(readXL[i][-2])
            elif type(readXL[i][-3]) is float:
                print(readXL[i])
                print(readXL[i][-3])
            break
    if flag_juju == 1:
        break

#4. 직원 등 현황
#for p in range(page_employee, page_ceo+10):#166
for p in range(page_ceo-2, page_ceo + 3):  # 166
    page = 'Page' + str(p)
    readXL = pd.read_excel(file, sheet_name=page).fillna(0)
    readXL = readXL.values
    for i in range(len(readXL)):
        if "합 계" in str(readXL[i][0]) :
            flag_employee = 1
            print(readXL[i]) #여러 보고서 비교가 필요함
            print(readXL[i][2])  #직원수
            print(readXL[i][5])  #근속연수
            print(readXL[i][9])  #평균연봉
            break
        elif "작성기준지침에 따라 분기보고서에는 기재하지 않습니다" in str(readXL[i][0]):
            flag_employee = 1
            print(readXL[i])
            print(readXL[i][0])
            break
    if flag_employee == 1:
        break

#4. 임원의 보수
for p in range(page_ceo, page_ceo+3):
    page = 'Page' + str(p)
    readXL = pd.read_excel(file, sheet_name=page).fillna(0)
    readXL = readXL.values
    for i in range(len(readXL)):
        if "인원수" in str(readXL[i][0]) :
            flag_ceo = 1
            print(readXL[i+1]) #여러 보고서 비교가 필요함
            print(readXL[i+1][5])
            break
        elif "작성기준지침에 따라 분기보고서에는 기재하지 않습니다" in str(readXL[i][0]):
            flag_ceo = 1
            print(readXL[i])
            print(readXL[i][0])
            break
    if flag_ceo == 1:
        break
728x90
728x90
import re
rmve_bracket_1 = "\(.\)|\s-\s.*"  # 정규표현식을 적용한 괄호 및 괄호 안 텍스트. 1차 괄호 제거
rmve_bracket_2 = "\(.*\)|\s-\s.*"  # 정규표현식을 적용한 괄호 및 괄호 안 텍스트. 2차 괄호 제거

with open("C:\\Users\\nigaw\\Desktop\\aaa.txt", 'r',encoding='UTF8') as f:
    lines = f.readlines()

lines.reverse()

f = open('C:\\Users\\nigaw\\Desktop\\bbb.txt', 'w')
for line in lines:
    line=re.sub(rmve_bracket_1, '', line)
    line=re.sub(rmve_bracket_2, '', line)
    line = line.strip()  # 포함되어 있는 줄 바꿈 문자 제거
    f.write(line)
    f.write('\n')        # 줄 바꿈 문자 삽입
f.close()
728x90

+ Recent posts