与从py文件转换而来的exe文件交互

问题描述 投票:0回答:1

我有以下 python 脚本。在我的 python 脚本中,我运行它来将一些 pdf 转换为 Excel。当我运行它时,我输入包含 pdf 的文件夹存在的文件名,然后按 Enter 键,我的脚本将继续处理 pdf 文件并返回一个结构化的 excel 文件。

我尝试使用以下命令将py文件转换为exe文件

pip install pyinstaller 
pyinstaller --onefile myscript.py

当我执行此操作时,我将返回一个 exe 文件,但是当我运行它时,cmd 弹出窗口会快速打开和关闭,而没有给我输入文件夹名称的机会。 有人可以帮忙吗?

这是Python脚本。

import pandas as pd
import re
import os
from datetime import date
import datetime
import tkinter as tk
from tkinter import simpledialog

def get_folder_name():
    root = tk.Tk()
    root.withdraw()  # Hide the main window
    folder = simpledialog.askstring("Folder Name", "Enter the folder name (e.g.,  23.08.2023):")
    return folder



def process_pdfs_and_generate_excel(base_directory, folder):
    dfs = []
    folder_path = os.path.join(base_directory, folder)
    if not os.path.exists(folder_path):
        print(f"Folder '{folder}' does not exist.")
        return None

    for root, _, files in os.walk(folder_path):
        for filename in files:
            if filename.endswith('.txt'):
                filepath = os.path.join(root, filename)
                with open(filepath, 'r') as file:
                    lines = file.readlines()

                start_line = 18
                weighted_average_line_index = None
                for i, line in enumerate(lines[start_line:], start=start_line):
                    if "WEIGHTED AVERAGE" in line:
                        weighted_average_line_index = i
                        break

                if weighted_average_line_index is not None:
                    table_data = [line.strip().split('|') for line in lines[start_line:weighted_average_line_index] if '|' in line]

                    column_names = ['ARRIVAL_DATE', 'CONTAINER_NO', 'GR_QTY', 'LOT_NUMBER', 'OTHER_PAPERS', 'MOISTURE', 'PROHIBITIVE', 'File Name', 'Folder Name', 'EXCEL_FILE_ID']
                    mapped_data = {}
                    for column_name, index in zip(column_names, [2, 3, 5, 6, 7, 8, 9, None, None, None]):
                        mapped_data[column_name] = []
                        for row in table_data:
                            if column_name == 'Folder Name':
                                mapped_data[column_name].append(folder)
                            elif column_name == 'File Name':
                                mapped_data[column_name].append(filename)
                            elif column_name == 'EXCEL_FILE_ID':
                                mapped_data[column_name].append(f'PT_EKAMAS_{folder}')
                            elif len(row) > index:
                                mapped_data[column_name].append(row[index].strip())
                            else:
                                mapped_data[column_name].append('')

                    invoice_pattern = r"Invoice No\.\s*:\s*(\d+)"
                    invoice_no = ''
                    for line in lines:
                        invoice_match = re.search(invoice_pattern, line)
                        if invoice_match:
                            invoice_no = invoice_match.group(1)
                            break

                    ordered_grade_column = 'ORDERED_GRADE'
                    ordered_quality_column = 'ORDERED_QUALITY'
                    ordered_grade_pattern = r"Material No\.\s*:\s*\d+\s*-\s*(.*?);"
                    ordered_quality_pattern = r"Material No\.\s*:\s*\d+\s*-\s*.*?;\s*(.*?)\s*,"
                    ordered_grade = ''
                    ordered_quality = ''
                    if len(lines) >= 7:
                        ordered_grade_match = re.search(ordered_grade_pattern, lines[6])
                        ordered_quality_match = re.search(ordered_quality_pattern, lines[6])
                        if ordered_grade_match:
                            ordered_grade = ordered_grade_match.group(1).strip()
                        if ordered_quality_match:
                            ordered_quality = ordered_quality_match.group(1).strip()

                    entity_line = lines[5].strip()
                    entity_match = re.search(r"Vendor No\.\s*:\s*(.*)", entity_line)
                    entity = entity_match.group(1).strip().split(' - ')[-1] if entity_match else ''

                    if 'UK' in entity:
                        entity = 'UK'
                    elif 'GREECE' in entity:
                        entity = 'GR'
                    elif 'ITALY' in entity:
                        entity = 'IT'
                    elif 'LAUSANNE' in entity:
                        entity = 'CH'
                    elif 'VIPA RECYCLING (IRELAND) LTD' in entity:
                        entity = 'IE'

                    mapped_data['Entity'] = [entity] * len(table_data)
                    mapped_data['Invoice No'] = [invoice_no] * len(table_data)
                    mapped_data[ordered_grade_column] = [ordered_grade] * len(table_data)
                    mapped_data[ordered_quality_column] = [ordered_quality] * len(table_data)

                    df = pd.DataFrame(mapped_data)
                    dfs.append(df)

    result_df = pd.concat(dfs, ignore_index=True)

    formatted_date = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')

    # Construct the folder path with the date
    folder_date = datetime.datetime.now().strftime('%Y%m%d')
    folder_path = os.path.join(base_directory, 'claims', folder_date)

    os.makedirs(folder_path, exist_ok=True)

    # Construct the Excel file path
    excel_filename = f'mycust{folder}_{formatted_date}.xlsx'
    excel_filepath = os.path.join(folder_path, excel_filename)

    # Add a new column with the name of the output Excel file
    result_df['EXCEL_FILE_NAME'] = excel_filename
    
    result_df['CONTAINER_NO'] = result_df['CONTAINER_NO'].apply(lambda x: re.search(r"/(.*?)/", x).group(1) if "/" in x else None)

    result_df.to_excel(excel_filepath, index=False)


    
    return excel_filepath

if __name__ == "__main__":
    base_directory = 'mydirectory'
    
    # Get the folder name from the user using the GUI
    folder = get_folder_name()
    
    if folder:
        excel_filepath = process_pdfs_and_generate_excel(base_directory, folder)
        if excel_filepath:
            print(f"Excel file saved at: {excel_filepath}")
    
    # Add an input prompt to keep the command prompt window open
    input("Press Enter to exit...")

python pyinstaller exe
1个回答
0
投票
仅当直接执行脚本时,

__name__
才是“__main__”。在可执行文件下,很可能它没有使用 __name__ 作为 __main__,因此内部的源代码可能无法运行。

尝试消除该

if __name__ == "main"
检查,如果其余步骤都正常的话应该很好。

© www.soinside.com 2019 - 2024. All rights reserved.