Python3.10 报错 UnboundLocalError: local variablereferenced before assignment,原因和解决办法

原来 的环境 是 python 3.7  torch1.13.1 环境 下面跑通的代码  

    到 python 3.10 和torch 2.3.1报错

原因:

  1. 在函数内部更改全局变量就会出现此错误。
  2. 函数内部没有初始化
  3. 函数内部的循环内部没有初始化 (3.10)

报错UnboundLocalError: local variablereferenced before assignment

如果在函数内部的 一开始的地方初始化变量还是会报错的

解决   gradient_penalty = 0  要在循环的内部,初始化

改成

def train(iterations, batch_size):
    num_steps = 0
    # 每多少次 生成一个批评家(鉴别器)
    critic_iterations = 10
    # 每多少次 输出下 损失数值
    print_every = 30
    with tqdm(total=iterations * batch_size, desc='Training', ncols=70) as pbar:
        dlosses = []  # 存储判别器损失
        glosses = []  # 存储生成器损失
        for iteration in range(iterations):
            for _ in range(batch_size):
                # 增加步数计数
                num_steps += 1

                # 初始化 gradient_penalty
                # python 3.10
                gradient_penalty = 0

                # 2. 训练生成器
                # 生成新的假数据
                # 每 critic_iterations 次迭代更新一次生成器
                if num_steps % critic_iterations == 1:
                    noise = torch.randn(batch_size, input_dim, device=device)
                    fake_data = generator(noise)
                    if gradient_penalty != 0 :
                        # 生成器的损失
                        g_loss = gradient_penalty.data.item()
                        glosses.append(g_loss.item())
                        # 重置判别器优化器的梯度
                        optimizer_G.zero_grad()
                        g_loss.backward()
                        optimizer_G.step()

其他

===================================================

摘录自 https://blog.csdn.net/weixin_48419914/article/details/122008139 ================================================

例一(不会报错):
a= 3
def temp():
    print(a)
temp() #输出的结果为3
在上面一段代码中,函数temp的操作是打印a的值,但函数内部并没有对a进行定义,此时系统会在外部寻找a的值,而我们在函数外部给a赋值为3,这种在函数外部赋值的变量被称为全局变量(global variable),这种情况下运行函数temp不会出错,

例二(会报错):
a= 3
def temp():
    print(a)
    a+=1
temp() #会报错, UnboundLocalError: local variable 'a' referenced before assignment
原因是我们定义的函数temp内部第一次打印a是调用的全局变量,而打印后却令a=a+1,在函数内部试图更改全局变量a导致错误。

例三(改正例二):
如果我们确实希望通过函数temp打印全局变量a,并且将a的值加1,那么就要在函数内部声明全局变量。

a= 3
def temp():
    global a #声明我们在函数内部使用的是在函数外部定义的全局变量a
    print(a)
    a+=1
temp() 
调用temp函数,不会再报错了。此时就会发现a的值确实变成4

 
 

Traceback (most recent call last): File "/app/visualize.py", line 759, in run_visualization analysisfile = pd.read_csv( File "/usr/local/lib/python3.10/dist-packages/pandas/util/_decorators.py", line 311, in wrapper return func(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py", line 680, in read_csv return _read(filepath_or_buffer, kwds) File "/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py", line 575, in _read parser = TextFileReader(filepath_or_buffer, **kwds) File "/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py", line 933, in __init__ self._engine = self._make_engine(f, self.engine) File "/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py", line 1217, in _make_engine self.handles = get_handle( # type: ignore[call-overload] File "/usr/local/lib/python3.10/dist-packages/pandas/io/common.py", line 789, in get_handle handle = open( FileNotFoundError: [Errno 2] No such file or directory: &#39;/log_data/1.3.26-2132/stats_without_nalimov_outlier_1.3.26-2132.csv&#39; 2025-03-21 15:34:37,123:INFO:cumulative plot 2025-03-21 15:34:37,123:ERROR:cant generate histogram plots (no analysisfile due to no db entry or not enough data) Traceback (most recent call last): File "/app/visualize.py", line 835, in run_visualization return cumulative_plot(analysis_folder, image_folder, analysisfile) UnboundLocalError: local variable &#39;analysisfile&#39; referenced before assignment 2025-03-21 15:34:37,123:INFO:performed cyclic generation of outlier and statistic plots for 1.3.26-2132 Finished outlier calculation! 2025-03-21 15:34:37,123:INFO:Outlier calculation for 1.4.8-480.10.320+ETD 2025-03-21 15:34:37,123:INFO:Starting Cyclic Data Generation for 1.4.8-480.10.320+ETD Generating Outlier for 1.4.8-480.10.320+ETD 2025-03-21 15:34:37,123:INFO:fetching database entries.. 2025-03-21 15:34:37,124:INFO:Finding outliers and create log overview for all floors 2025-03-21 15:34:37,125:INFO:Analysis folder /log_data/1.4.8-480.10.320+ETD/filtered_logs/analyzed 2025-03-21 15:34:37,127:ERROR:Could not generate outlier for 1.4.8-480.10.320+ETD Traceback (most recent call last): File "/app/docker_outlier.py", line 63, in <module> generate_outlier_and_visualization(firmware) File "/app/docker_outlier.py", line 28, in generate_outlier_and_visualization outlier.outliergenerator(current_firmware) File "/app/outlier.py", line 840, in outliergenerator out.generate_outlier() File "/app/outlier.py", line 459, in generate_outlier self.allruns_printout(self.list_of_logs) # write csv of all runs File "/app/outlier.py", line 753, in allruns_printout alllogs_overview.to_csv(os.path.join( File "/usr/local/lib/python3.10/dist-packages/pandas/core/generic.py", line 3551, in to_csv return DataFrameRenderer(formatter).to_csv( File "/usr/local/lib/python3.10/dist-packages/pandas/io/formats/format.py", line 1180, in to_csv csv_formatter.save() File "/usr/local/lib/python3.10/dist-packages/pandas/io/formats/csvs.py", line 241, in save with get_handle( File "/usr/local/lib/python3.10/dist-packages/pandas/io/common.py", line 697, in get_handle check_parent_directory(str(handle)) File "/usr/local/lib/python3.10/dist-packages/pandas/io/common.py", line 571, in check_parent_directory raise OSError(rf"Cannot save file into a non-existent directory: &#39;{parent}&#39;") OSError: Cannot save file into a non-existent directory: &#39;/log_data/1.4.8-480.10.320+ETD&#39;
最新发布
03-22
<think>嗯,用户遇到了一个Python程序的错误日志,需要我帮忙分析。首先,我需要仔细看看这个错误信息。看起来有两个主要的错误:一个是FileNotFoundError,另一个是OSError,都涉及到文件路径的问题。另外还有一个UnboundLocalError,说是在赋值前引用了局部变量analysisfile。 首先看第一个错误,FileNotFoundError,提示找不到文件&#39;/log_data/1.3.26-2132/stats_without_nalimov_outlier_1.3.26-2132.csv&#39;。这说明程序在尝试读取这个CSV文件时,发现路径不存在。可能的原因是这个路径或者文件没有被正确创建,或者在运行脚本之前没有被正确生成。 然后,第二个错误是UnboundLocalError,说在run_visualization函数中,变量analysisfile在赋值前被引用。查看代码,可能是因为在读取CSV文件时出现异常,导致analysisfile没有被正确赋值,然后在后续使用的时候抛出了这个错误。这说明错误处理可能不够完善,没有处理文件不存在的情况,导致变量未初始化。 接下来是第三个错误,OSError,指出无法将文件保存到不存在的目录&#39;/log_data/1.4.8-480.10.320+ETD&#39;。这里的问题是在尝试写入文件时,目标目录不存在,导致保存失败。程序可能在生成输出文件前没有检查目录是否存在,或者没有自动创建所需的目录结构。 综合这些错误,问题主要集中在文件路径的处理上。可能的根本原因是相关目录或文件未正确创建,导致读取写入失败。需要检查程序在运行前是否确保所有必要的目录已经存在,或者在访问文件之前先创建这些目录。 接下来,我需要思考用户可能的场景。用户可能在运行一个数据处理或可视化的Python脚本,涉及到从CSV文件读取数据并生成分析结果图表。用户遇到的错误可能是在脚本执行过程中出现的,导致程序中断,无法完成预期的任务。用户可能需要知道如何解决这些文件路径的问题,确保程序能够顺利运行。 用户的身份可能是开发人员或数据分析师,使用Python处理日志数据,生成统计信息可视化图表。他们可能对Python的文件操作异常处理不太熟悉,需要指导如何排查解决这些错误。 用户的真实需求是解决这些错误,使程序正常运行。深层需求可能包括学习如何避免类似的错误,提高代码的健壮性,确保文件路径正确,处理异常情况等。 接下来,我需要整理解决这些问题的步骤。首先,检查文件路径是否存在,确保在读取或写入之前目录已经创建。其次,处理文件不存在的情况,添加异常处理或检查文件是否存在。最后,确保在引用变量之前变量已经被正确赋值,避免UnboundLocalError。 可能的解决方案包括使用os.makedirs创建目录,检查文件是否存在后再读取,使用try-except块捕获异常,并在变量使用前确保其已被正确初始化。 现在,我需要将这些思考整理成用户能够理解的步骤,用清晰的中文解释错误原因,并提供具体的解决方法,帮助用户逐步解决问题。</think>这个错误日志反映了文件路径处理相关的三个关键问题,我将逐步解释问题根源并提供解决方案: $\boxed{错误分析}$ 1. $\boxed{FileNotFoundError}$: - 路径 `/log_data/1.3.26-2132/` 下缺少 `stats_without_nalimov_outlier_*.csv` 文件 - 原因:尝试读取未生成的文件/未创建的目录 2. $\boxed{UnboundLocalError}$: - 在 `run_visualization` 函数中,当文件读取失败时未初始化 `analysisfile` 变量就直接引用 3. $\boxed{OSError}$: - 路径 `/log_data/1.4.8-480.10.320+ETD` 不存在时尝试写入文件 $\boxed{解决方案}$ 1. $\boxed{路径预创建}$ (核心问题) ```python import os # 在文件操作前添加目录创建逻辑 output_dir = "/log_data/目标目录" os.makedirs(output_dir, exist_ok=True) # 自动创建不存在的目录 ``` 2. $\boxed{文件存在性检查}$ ```python file_path = "/log_data/.../xxx.csv" if os.path.exists(file_path): analysisfile = pd.read_csv(file_path) else: print(f"警告:文件 {file_path} 不存在") analysisfile = pd.DataFrame() # 创建空数据框避免后续错误 ``` 3. $\boxed{异常处理增强}$ ```python try: analysisfile = pd.read_csv(path) except FileNotFoundError as e: logging.error(f"文件读取失败: {str(e)}") analysisfile = None # 显式初始化变量 ``` 4. $\boxed{变量初始化规范}$ ```python def run_visualization(): analysisfile = None # 显式初始化 try: # 读取操作... except Exception as e: # 错误处理... finally: if analysisfile is not None: # 后续处理... ``` $\boxed{预防措施}$ 1. 使用路径管理库简化操作: ```python from pathlib import Path csv_path = Path("/log_data") / "1.3.26-2132" / "stats.csv" csv_path.parent.mkdir(parents=True, exist_ok=True) # 自动创建父目录 ``` 2. 实现文件生成校验: ```python def generate_file(path): if not path.exists(): raise RuntimeError(f"关键文件 {path} 未生成,请检查前置流程") ``` $\boxed{系统优化建议}$ 1. 建立目录树验证流程: ```python REQUIRED_DIRS = [ "/log_data", "/log_data/analyzed", "/log_data/filtered_logs" ] def validate_directories(): for dir_path in REQUIRED_DIRS: Path(dir_path).mkdir(exist_ok=True) ``` 2. 实现文件操作装饰器增强健壮性: ```python def file_safety(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except (FileNotFoundError, PermissionError) as e: logging.error(f"文件操作失败: {str(e)}") return None return wrapper @file_safety def safe_read_csv(path): return pd.read_csv(path) ``` 通过以上改进可显著提升程序的健壮性,建议在以下关键点增加日志记录: - 目录创建成功/失败时 - 文件生成/读取操作前后 - 异常捕获时记录完整堆栈信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值