pyinstaller创建无用的可执行文件

时间:2016-12-13 22:40:28

标签: python excel windows pyinstaller

我得到了解析XML脚本的任务,以便将某些值放入Excel工作表中。 脚本运行正常,但现在我必须创建一个可执行文件。

在我阅读了几篇有关它的内容后,我认为pyinstaller可能是实现目标的最佳方式。但它只会产生一个无用的可执行文件。

所以我读了更多,发现,python使用隐藏的库。我试图找出,我隐藏的库是什么以及如何包含它们,但我没有这样做。

我被告知要使用" -v"获取隐藏库的选项。但老实说,我甚至都不知道,我在看什么。

如果我尝试在" hiddenimports"在spec文件中,但它被覆盖了。 所以我不确定它是否被使用。

我附上了代码,它应该都是标准的库。

有人可以指出我错过了什么吗?

谢谢!



from xml.etree import ElementTree
import openpyxl
import tkinter as tk
from tkinter import filedialog
import time


def getFileName(filepath):
    print("File Path: {}".format(filepath))
    split1 = filepath.split(".")
    split2 = split1[0].split("/")

    print("Filename: {}".format(split2[-1]))
    return split2[-1]


def parseFile(input_file):
    xmlTree = ElementTree.parse(input_file)
    xmlRoot = xmlTree.getroot()

    filename = getFileName(input_file)

    comm = xmlRoot.find('vehicle/communications')

    ECUS_events = comm.find("ecus[@type='read_events']")
    ECUS_diag = comm.find("ecus[@type='single_ecu_diagnostic']")
    ECUS_meas = comm.find("ecus[@type='read_measurements']")

    print("ECUS: 'Read_Events':{}, 'Read_Measurements':{}, 'Single_Diagnostic':{}".format((ECUS_events is not None),
                                                                                          (ECUS_meas is not None),
                                                                                          (ECUS_diag is not None)))
    print("ECUS: {}, {}, {}\n".format(ECUS_events, ECUS_meas, ECUS_diag))
    ecus = []
    dtc = []

    for ECU in ECUS_events.iter('ecu'):
        ecu = []
        ecu_name = ECU.find('ecu_name').text
        ecu_id = ECU.find('ecu_id').text
        print("ECU: {} - {}".format(ecu_id, ecu_name))

        ecu.append(ecu_name)
        ecu.append(ecu_id)

        ecu_master_ident = ECU.find("ecu_master[@type='ident']")

        if ecu_master_ident is not None:
            for value in ecu_master_ident.iter('values'):
                if value.find('display_name') is not None:
                    if value.find('display_name').text == "SoftwareVersion":
                        SW_version = value.find('display_value').text
                        print("Found SW ver: {}".format(SW_version))
                        ecu.append(SW_version)

                if value.find('display_name') is not None:
                    if value.find('display_name').text == "HardwareVersion":
                        HW_version = value.find('display_value').text
                        print("Found HW ver: {}".format(HW_version))
                        ecu.append(HW_version)

                if value.find('display_name') is not None:
                    if value.find('display_name').text == "VW/Audi part number":
                        VW_AUDI_part = value.find('display_value').text
                        print("Found VW/Audi #: {}".format(VW_AUDI_part))
                        ecu.append(VW_AUDI_part)

                if value.find('display_name') is not None:
                    if value.find('display_name').text == "Hardware part number":
                        HW_part = value.find('display_value').text
                        print("Found HW #: {}".format(HW_part))
                        ecu.append(HW_part)

        ecu_master_dtc = ECU.find("ecu_master[@type='event_memory']")
        DTC_count = 0
        if ecu_master_dtc is not None:

            DTCs = ecu_master_dtc.findall('values')
            for DTC in DTCs:
                DTC_count += 1
                DTC_name = DTC.find('display_name')
                DTC_number = DTC.find('fault_number')
                DTC_text = DTC.find('dtc_text')
                DTC_ecu = ecu_id + " - " + ecu_name
                print("DTC: {} - {} | {}".format(DTC_number.text, DTC_name.text, DTC_text.text))
                dtc.append([DTC_number.text, DTC_name.text, DTC_text.text, DTC_ecu])
            if DTC_count:
                print("DTC Count: {}".format(DTC_count))
        else:
            print("No DTC Category")

        ecu.append(DTC_count)

        print("\n")
        ecus.append(ecu)

    single_diag = []
    if ECUS_diag is not None:
        for ECU in ECUS_diag.iter('ecu'):
            ecu_info = []

            ecu_name = ECU.find('ecu_name').text
            ecu_id = ECU.find('ecu_id').text

            length = len(ecu_name) + len(ecu_id) + 18
            for char in range(0, length):
                print("-", end="")
            print("\n---- ECU: {} - {} ----".format(ecu_id, ecu_name))
            for char in range(0, length):
                print("-", end="")
            print("")

            ecu_info.append(ecu_name)
            ecu_info.append(ecu_id)

            ecu_master_ident = ECU.find("ecu_master[@type='ident']")

            if ecu_master_ident is not None:
                for value in ecu_master_ident.iter('values'):
                    if value.find('display_name') is not None:
                        if value.find('display_name').text == "Coding":
                            coding = value.find('display_value').text
                            print("Found Coding: {}".format(coding))
                            ecu_info.append(coding)

            ecu_master_adapt = ECU.find("ecu_master[@type='adaption_read']")

            ecu_adaption = []
            if ecu_master_adapt is not None:
                print("Gathering 'Adaption' data...")
                for values in ecu_master_adapt.findall('values'):
                    adapt_list = []

                    Outer_cat = values.find('display_name')
                    adapt_list.append(Outer_cat.text)

                    value_list = []
                    for value in values.findall('values'):
                        inner_name = value.find('display_name')
                        inner_val = value.find('display_value')
                        if inner_name is not None and inner_val is not None:
                            value_list.append([inner_name.text, inner_val.text])
                        elif inner_val is not None:
                            value_list.append([inner_val.text])
                        elif inner_name is not None:
                            value_list.append([inner_name.text])
                        else:
                            value_list.append([])

                    adapt_list.append(value_list)
                    ecu_adaption.append(adapt_list)

            ecu_master_coding = ECU.find("ecu_master[@type='coding_read']")

            ecu_coding = []
            if ecu_master_coding is not None:
                print("Gathering 'Coding' data...")
                for values in ecu_master_coding.findall('values'):
                    code_list = []
                    val_list = []
                    code_name = values.find('display_name')
                    code_val = values.find('display_value')
                    code_bin = values.find('bin_value')
                    code_hex = values.find('hex_value')

                    if code_name is not None:
                        code_list.append(code_name.text)
                    else:
                        print("No Code Name present")
                        code_list.append("None")

                    if code_val is not None:
                        val_list.append(code_val.text)

                    if code_bin is not None:
                        val_list.append(["Hex", code_bin.text])

                    if code_bin is not None:
                        val_list.append(["Bin", code_hex.text])

                    code_list.append(val_list)
                    # print(code_list)
                    ecu_coding.append(code_list)

            single_diag.append([ecu_info, ecu_adaption, ecu_coding])

    meas_ocu = []
    if ECUS_meas is not None:
        for ECU in ECUS_meas.iter('ecu'):
            ecu_name = ECU.find('ecu_name').text
            ecu_id = ECU.find('ecu_id').text

            if ecu_name == "Telematics Communication Unit" and ecu_id == "0075":
                ocu_info = [ecu_name, ecu_id]

                length = len(ecu_name) + len(ecu_id) + 18
                for char in range(0, length):
                    print("-", end="")
                print("\n---- OCU: {} - {} ----".format(ecu_id, ecu_name))
                for char in range(0, length):
                    print("-", end="")
                print("")

                ocu_master = ECU.find("ecu_master[@type='measurement']")

                ocu_values = []
                for Values in ocu_master.findall('values'):
                    display_name = Values.find('display_name')

                    if display_name is not None:
                        print(display_name.text)

                    values_disp = []
                    for values in Values.findall('values'):
                        disp_value = values.find('display_value')
                        disp_unit = values.find('display_unit')
                        disp_name = values.find('display_name')

                        if disp_value is not None and disp_unit is not None and disp_name is not None:
                            print("Name: {} | Value: {} {}".format(disp_name.text, disp_value.text, disp_unit.text))
                            values_disp.append([disp_name.text, "{} {}".format(disp_value.text, disp_unit.text)])
                        elif disp_value is not None and disp_name is not None:
                            print("Name: {} | Value: {}".format(disp_name.text, disp_value.text))
                            values_disp.append([disp_name.text, disp_value.text])
                        elif disp_value is not None and disp_unit is not None:
                            print("Value: {} {}".format(disp_value.text, disp_unit.text))
                            values_disp.append(["{} {}".format(disp_value.text, disp_unit.text)])
                        elif disp_value is not None:
                            print("Value: {}".format(disp_value.text))
                            values_disp.append([disp_value.text])

                    ocu_values.append([display_name.text, values_disp])
                    print("")

                meas_ocu.append([[ecu_name, ecu_id], ocu_values])

    print("\n")
    print("Printing final structures:\n")

    print("ECU Readouts:")
    for elem in ecus:
        print(elem)

    print("\nDTC Readouts:")
    for elem in dtc:
        print(elem)

    book = openpyxl.Workbook()
    sheet_ecu = book.active
    sheet_ecu.title = 'ECUs'

    sheet_dtc = book.create_sheet("DTCs", 1)
    sheet_0075 = book.create_sheet("ECU - 0075", 2)
    sheet_005F = book.create_sheet("ECU - 005F", 3)

    print("\nWriting to workbook...")

    sheet_ecu.cell(row=1, column=1, value="ECU Name")
    sheet_ecu.cell(row=1, column=2, value="ECU ID")
    sheet_ecu.cell(row=1, column=3, value="SW")
    sheet_ecu.cell(row=1, column=4, value="HW")
    sheet_ecu.cell(row=1, column=5, value="VW/Audi #")
    sheet_ecu.cell(row=1, column=6, value="HW #")
    sheet_ecu.cell(row=1, column=7, value="DTCs")

    sheet_dtc.cell(row=1, column=1, value="DTC #")
    sheet_dtc.cell(row=1, column=2, value="Name")
    sheet_dtc.cell(row=1, column=3, value="Text")
    sheet_dtc.cell(row=1, column=4, value="ECU")

    sheet_005F.cell(row=1, column=1, value="No '005F' diagnostic found")
    sheet_0075.cell(row=1, column=1, value="No '0075' diagnostic found")

    cur_row = 2

    for elem in ecus:
        cur_column = 1
        for cell in elem:
            sheet_ecu.cell(row=cur_row, column=cur_column, value=cell)
            cur_column += 1
        cur_row += 1

    cur_row = 2
    for elem in dtc:
        cur_column = 1
        for cell in elem:
            sheet_dtc.cell(row=cur_row, column=cur_column, value=cell)
            cur_column += 1
        cur_row += 1

    telecom_cur_row = 0
    if len(single_diag) > 0:
        print("Single Diag: {} {}".format(len(single_diag), [single_diag[0][0][1], single_diag[1][0][1]]))
        for diag in single_diag:
            print("ECU Diagnostic:{} - {}".format(diag[0][1], diag[0][0]))
            if diag[0][1] == "0075":
                sheet_0075.cell(row=1, column=1, value=diag[0][1])
                sheet_0075.cell(row=1, column=2, value=diag[0][0])

                sheet_0075.cell(row=2, column=1, value="Coding")
                sheet_0075.cell(row=2, column=2, value=diag[0][2])

                sheet_0075.cell(row=4, column=1, value="--Adaption--")

                cur_row = 5
                for element in diag[1]:
                    sheet_0075.cell(row=cur_row, column=1, value=element[0])
                    if len(element[1]) > 1:
                        string = ""
                        for value in element[1]:
                            string += "{} : {}".format(value[0], value[1]) + " \n"
                    else:
                        string = element[1]
                        while type(string) is list:
                            string = string[0]

                    sheet_0075.cell(row=cur_row, column=2, value=string)
                    cur_row += 1

                sheet_0075.cell(row=cur_row + 1, column=1, value="--Coding--")
                cur_row += 2
                for element in diag[2]:

                    sheet_0075.cell(row=cur_row, column=1, value=element[0])
                    if len(element[1]) > 1:
                        string = ""
                        for value in element[1]:
                            string += "{} : {}".format(value[0], value[1]) + " \n"
                    else:
                        string = element[1]
                        while type(string) is list:
                            string = string[0]

                    sheet_0075.cell(row=cur_row, column=2, value=string)
                    cur_row += 1

                telecom_cur_row = cur_row + 1

            if diag[0][1] == "005F":
                sheet_005F.cell(row=1, column=1, value=diag[0][1])
                sheet_005F.cell(row=1, column=2, value=diag[0][0])

                sheet_005F.cell(row=2, column=1, value="Coding")
                sheet_005F.cell(row=2, column=2, value=diag[0][2])

                sheet_005F.cell(row=4, column=1, value="--Adaption--")

                cur_row = 5
                for element in diag[1]:
                    sheet_005F.cell(row=cur_row, column=1, value=element[0])
                    if len(element[1]) > 1:
                        string = ""
                        for value in element[1]:
                            string += "{} : {}".format(value[0], value[1]) + " \n"
                    else:
                        string = element[0]
                        while type(string) is list:
                            string = string[0]

                    sheet_005F.cell(row=cur_row, column=2, value=string)
                    cur_row += 1

                sheet_005F.cell(row=cur_row + 1, column=1, value="--Coding--")
                cur_row += 2
                for element in diag[2]:
                    sheet_005F.cell(row=cur_row, column=1, value=element[0])
                    if len(element[1]) > 1:
                        string = ""
                        for value in element[1]:
                            string += "{} : {}".format(value[0], value[1]) + " \n"
                    else:
                        string = element[1]
                        while type(string) is list:
                            string = string[0]
                    sheet_005F.cell(row=cur_row, column=2, value=string)
                    cur_row += 1

    if len(meas_ocu) > 0:
        # print(meas_ocu)
        if telecom_cur_row == 0:
            telecom_cur_row = 3
        for diag in meas_ocu:
            cur_row = telecom_cur_row
            print("OCU Diagnostic: {} - {}".format(diag[0][0], diag[0][1]))
            if diag[0][1] == "0075":
                sheet_0075.cell(row=cur_row, column=1, value="--Measured Values--")
                cur_row += 1

                for element in diag[1]:
                    sheet_0075.cell(row=cur_row, column=1, value=element[0])
                    if len(element[1]) > 1:
                        string = ""
                        for value in element[1]:
                            string += "{} : {}".format(value[0], value[1]) + " \n"
                    elif len(element[1]) == 1:
                        string = element[1]
                        while type(string) is list:
                            string = string[0]


                    sheet_0075.cell(row=cur_row, column=2, value=string)
                    cur_row += 1



    print("Saving to '.xlsx' file....")

    book.save("{}_parsed.xlsx".format(filename))

    print("Complete")


def verifyFile(filename):
    approve = 1

    print("File Path: {}".format(filename))
    split1 = filename.split(".")
    if split1[1] == "xml":
        print("File Extension Match!")
    else:
        approve = 0
        print("File Extension '{}' Incorrect, rejecting".format(split1[1]))

    print("")

    return approve


def buttonPrompt():
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename()

    print(file_path)
    if verifyFile(file_path):
        parseFile(file_path)
    else:
        print("File Rejected")

if __name__ == '__main__':
    buttonPrompt()




1 个答案:

答案 0 :(得分:0)

我有同样的问题,你必须在pyinstaller中添加一个钩子才能让它工作。

请参阅:

# ./buildhoos/hook-openpyxl.py

from PyInstaller.utils.hooks import collect_data_files

datas = collect_data_files('openpyxl')

将其添加到规范的Analysis部分中 hookspath=['./buildhooks'],

如果我需要进一步澄清,请告诉我们 添