简体   繁体   English

当文件从 IDE 运行时尝试 except 工作但是当用 pyinstaller 编译成 exe 时它不起作用

[英]Try except works when file is run from IDE but when compiled into exe with pyinstaller it doesnt work

I created a python tool with Tkinter GUI.我用 Tkinter GUI 创建了一个 python 工具。 These are the pieces of the script.这些是脚本的片段。 The problem is with the try-except in these lines of code.问题在于这些代码行中的 try-except。

try:
   pldf_csv[data['sls_data']['add_columns']].write_csv(endpath,sep='\t')
except:
   write_eror_status = True
   print("CANNOT WRITE FILE")

If I run the python file via VSCode the try-except works like this如果我通过 VSCode 运行 python 文件,try-except 会像这样工作

在此处输入图像描述

But then if I compile the script with pyinstaller to exe , those line doesn't execute at all但是如果我用pyinstaller编译脚本到exe ,那些行根本不会执行

Full code完整代码

class IngestGenerator:
    def __init__(self, fn,fd,n3pl):
        self.filename = fn
        self.filedir = fd
        self.name3pl = n3pl
    
    def generate_result_csv(self):
        """To extend 3PL please refer to comment with <(extend this)> note
           Don't forget to extend the yaml when extending 3PL
        """
        
        start_time = time.time()

        # with open("columns 1a.yaml", 'r') as f:
        with open(os.path.join(os.path.dirname(__file__), 'columns 1a.yaml'), 'r') as f:
            data = yaml.load(f, Loader=SafeLoader)

        with tempfile.TemporaryDirectory() as tmpdirname:
            try :
                # create new list if there's new 3pl behavior (extend this)
                list_type_like = [data['behavior']['type_like'][i]['name3pl'] for i in range(0,len(data['behavior']['type_like']))] #collects names of 3pl which have categorical column to be divided based on
                write_eror_status = False
                status = False
                for i in range(0,len(data['behavior']['type_like'])):
                    if data['behavior']['type_like'][i]['name3pl']==self.name3pl: #get the name of category column and the values of categories (extend this whole if-statement)
                        list_types = data['behavior']['type_like'][i]['cats']
                        cat_column = data['behavior']['type_like'][i]['categorical_col']
                        status = True
                    else : pass
                if status == False: #for logging to check if its in the list of type-like 3pl (extend this whole if else statement)
                    print("3PL cannot be found on type-like 3PL list")
                else: print("3PL can be found on type-like 3PL list")

                try:
                    for cat in list_types: #dynamic list creation for each category (extend this line only)
                        globals()[f"{cat}_final_df"] = []
                except : print("3pl isn't split based on it's categories")

                xl = win32com.client.Dispatch("Excel.Application")
                print("Cast to CSV first (win32com)")
                wb = xl.Workbooks.Open(self.filename,ReadOnly=1)
                xl.DisplayAlerts = False
                xl.Visible = False
                xl.ScreenUpdating = False
                xl.EnableEvents = False
                sheet_names = [sheet.Name for sheet in wb.Sheets if sheet.Name.lower() != 'summary']
                print("Sheet names")
                print(sheet_names)

                for sheet_name in sheet_names:
                    print("Reading sheet "+sheet_name)
                    ws = wb.Worksheets(sheet_name)
                    ws.SaveAs(tmpdirname+"\\myfile_tmp_{}.csv".format(sheet_name), 24)

                    used_columns = data['sls_data'][f'{self.name3pl.lower()}_used_columns']
                    renamed_columns = data['sls_data'][f'{self.name3pl.lower()}_rename_columns']
                    rowskip = data['behavior']['row_skip'][f'{self.name3pl.lower()}']
                    list_dtypes = [str for u in used_columns]
                    print("CP 1")

                    scandf = pl.scan_csv(tmpdirname+"\\myfile_tmp_{}.csv".format(sheet_name),skip_rows= rowskip,n_rows=10) #scan csv to get column name
                    print(scandf.columns)
                    scanned_cols = scandf.columns.copy()
                    used_cols_inDF = [] #collects column names dynamically
                    for i in range(0,len(used_columns)):
                        if type(used_columns[i]) is list: #check for each scanned-columns which contained in yaml used_columns, append if the scanned columns exist in yaml
                            for sc in scanned_cols:
                                for uc in used_columns[i]:
                                    if sc == uc:
                                        print(f"Column match : {uc}")
                                        used_cols_inDF.append(uc)
                                    else:pass       
                        else:
                            for sc in scanned_cols: #purpose is same with the if statement
                                if sc == used_columns[i]:
                                    print(f"Column match : {used_columns[i]}")
                                    used_cols_inDF.append(used_columns[i])
                                else:pass
                    print(used_cols_inDF)
                    """
                    JNT files have everchanging column names. Some files only have Total Ongkir, some only have Total,
                    and some might have Total and Total Ongkir. If both exists then will use column Total Ongkir (extend this if necessary i.e for special cases of 3pl)
                    """
                    if self.name3pl == 'JNT':
                        if "Total" in used_cols_inDF and "Total Ongkir" in used_cols_inDF:
                            used_cols_inDF.remove("Total")
                        else:pass
                    else:pass 
                    
                    pldf_csv = pl.read_csv(tmpdirname+"\\myfile_tmp_{}.csv".format(sheet_name),
                            columns = used_cols_inDF,
                            new_columns = renamed_columns,
                            dtypes = list_dtypes,
                            skip_rows= rowskip
                        ).filter(~pl.fold(acc=True, f=lambda acc, s: acc & s.is_null(), exprs=pl.all(),)) #filter rows with all null values
                    print(pldf_csv)
                    print(pldf_csv.columns)
                    
                    for v in data['sls_data']['add_columns']: #create dynamic columns
                        if "3pl invoice distance (m) (optional)" in v.lower() or "3pl cod amount (optional)" in v.lower():
                            pldf_csv = pldf_csv.with_column(pl.Series(name="{}".format(v),values= np.zeros(shape=pldf_csv.shape[0])))
                        elif "3pl tn (mandatory)" in v.lower() or  "weight (kg) (optional)" in v.lower():
                            pass
                        elif "total fee (3pl) (optional)" in v.lower():
                            pldf_csv = pldf_csv.with_column(pl.col(v).str.replace_all(",","").str.strip().cast(pl.Float64,False).fill_null(0))
                        else : 
                            pldf_csv = pldf_csv.with_column(pl.lit(None).alias(v))
                    print(pldf_csv)
                    
                    endpath = self.filedir+"\{}_{}_{}.csv".format(get_file_name(file_name_appear_label["text"]),sheet_name,"IngestResult").replace('/','\\')
                    if self.name3pl not in list_type_like: #(extend this line only)
                        if self.name3pl == 'JNT': #(extend this line and its statement if necessary i.e for special cases of 3pl)
                            pldf_csv = pldf_csv.with_column((pl.col("Total Fee (3PL) (Optional)")+pl.col("Biaya Asuransi").str.replace_all(",","").str.strip().cast(pl.Float64,False).fill_null(0)).alias("Total Fee (3PL) (Optional)"))
                        else: pass
                        print(pldf_csv)
                        try:
                            pldf_csv[data['sls_data']['add_columns']].write_csv(endpath,sep='\t')
                        except:
                            write_eror_status = True
                            print("CANNOT WRITE FILE")
                    elif self.name3pl in list_type_like: #(extend this line only)
                        for cat in list_types:
                            globals()[f"{cat}_final_df"].append(pldf_csv.filter(pl.col(cat_column).str.contains(cat)))

                if self.name3pl not in list_type_like:
                    pass
                elif self.name3pl in list_type_like:
                    for cat in list_types:
                            globals()[f"{cat}_final_df"] = pl.concat(globals()[f"{cat}_final_df"])
                            print(globals()[f"{cat}_final_df"])
                            globals()[f"endpath_{cat}"] = self.filedir+"\{}_{}_{}.csv".format(get_file_name(file_name_appear_label["text"]),cat,"IngestResult").replace('/','\\')
                            print("done creating paths")
                            try:
                                globals()[f"{cat}_final_df"][data['sls_data']['add_columns']].write_csv(globals()[f"endpath_{cat}"],sep='\t')
                            except :
                                write_eror_status = True
                                print("CANNOT WRITE FILE")
                if write_eror_status == False:
                    progress_label["text"] = "Successful!"
                else:
                    progress_label["text"] = "Cannot write result into Excel, please close related Excel files and kill Excel processes from Task Manager"

                print("Process finished")
            except Exception as e:
                print("ERROR with message")
                print(e)
                progress_label["text"] = "Failed due to {}".format(e)
            finally : 
                wb.Close(False)
                submit_btn["state"] = "normal"
                browse_btn["state"] = "normal"

        print("Total exec time : {}".format((time.time()-start_time)/60))
def file_submit_btn_click():
    if (file_name_appear_label["text"]==""):
        progress_label["text"] = "Please input your file"
    elif option_menu.get() == '':
        progress_label["text"] = "Please select 3pl name"
    else:
        try :
            submit_btn["state"] = "disabled"
            browse_btn["state"] = "disabled"
            progress_label["text"] = "Loading . . ."
            name3pl = option_menu.get()
            ingest = IngestGenerator(file_name,file_path,name3pl)
            print(get_file_name(file_name_appear_label["text"]))
            threading.Thread(target=ingest.generate_result_csv).start()
        except Exception as e:
            print(e)

Since the error was raised when writing CSV with polars and polars has its own dependencies, when it's in exe form it needs to include --recursive-copy-metadata as per documentation pyinstaller --recursive-copy-metadata polars --onefile -w "myfile.py"由于在使用polars写入 CSV 时出现错误,并且polars有其自身的依赖项,因此当它处于 exe 形式时,需要根据文档pyinstaller --recursive-copy-metadata polars --onefile -w "myfile.py"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试创建 exe 文件时出现 Pyinstaller 错误 - Pyinstaller Error when try to create exe file 定期运行时,Python脚本运行良好,但使用PyInstaller编译时,效果不佳 - Python script works fine when run regularly, but not when compiled with PyInstaller Python 2.7:从 pyinstaller 创建的 exe 文件不起作用 - Python 2.7 : exe file created from pyinstaller doesnt work try/except 在 pycharm 中有效,但在使用 pyinstaller 编译后在 exe 中无效 - try/except works in pycharm but doesn't work in exe after compiling using pyinstaller 我收到 pyinstaller 的错误,从 py 到 exe 的转换工作正常,但是当我尝试打开它时出现错误 - I am reciving an error for pyinstaller, conversion from py to exe works fine but there is an error when i try to open it Pyinstaller问题,当我尝试制作一个exe文件时 - Pyinstaller problem, when i try to make an exe file Concurrent.futures&gt;在命令行中运行良好,而不是在使用pyinstaller或py2exe编译时 - Concurrent.futures > works well in command line, not when compiled with pyinstaller or py2exe 使用 pyinstaller 创建的 .exe 文件在我运行时立即关闭 - .exe file created with pyinstaller shuts down immediately when i run it 尝试运行 pyinstaller 创建的 .exe 文件时“执行脚本失败” - “Failed to execute script” when trying to run .exe file created by pyinstaller 我的exe 从 pyinstaller 创建的文件不像它是 .py 时那样工作(Pyexcel 问题) - My exe. file created from pyinstaller doesn't work like it does when it was .py (Pyexcel problem)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM