You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程代码输出符合预期但报NameError:fib_position未定义

问题描述

使用多进程生成指定数量文件并写入斐波那契数时,明明已定义fib_position变量,却触发NameError提示未定义。代码及错误信息如下:

代码

def create_folder():
        path="C:\Users\HansPeterJonasHogh-J\dev\docs\pyhtonexercise\async_multi"
        os.chdir(path)
        fib_folder= 'fibFolder-01'
        os.makedirs(fib_folder)

def generate_array(fib_position):
    fibarray=[1,] 
    num1 = 0
    num2 = 1
    current_index = 1
    fibnum=0
    while current_index < fib_position:
            fibnum = (num1+num2)
            num1 = num2
            num2 = fibnum
            current_index = (current_index+1)
            fibarray.append(int(fibnum))
    return(fibarray)

def write_file(fibarray):
    for X in range(1, len(fibarray) +1):
        with open(f"fib-number-{X}.txt", "w") as file:
            file.write(str(fibarray[:X]))
            file.close()

if __name__== "__main__":
    fib_position = 7


# multiprocessing
st = time.time()

p2 = multiprocessing.Process(target=generate_array, args=(fib_position, ))


create_folder()
p2.start()

#p1.join()
#p2.join()

st = time.time()
en = time.time()
print("time taken = ", en-st)

错误信息

J\dev\docs\pyhtonexercise\async_multi\three_programs.py", line 37, in <module>
    p2 = multiprocessing.Process(target=generate_array, args=(fib_position, ))
NameError: name 'fib_position' is not defined
错误原因

fib_position变量定义在if __name__ == "__main__":代码块内部,而创建多进程的代码写在了该代码块的外部。

Python中,if __name__ == "__main__":是一个局部作用域代码块,内部定义的变量仅在该块内有效,外部代码无法直接访问。同时,启动多进程时子进程会重新导入脚本,顶层代码会被执行,但if __name__ == "__main__":内的代码不会在子进程中运行,双重因素导致变量无法被正确识别。

解决方法

将所有和多进程相关的代码移到if __name__ == "__main__":代码块内部,同时补充缺失的导入语句、修复潜在的文件路径问题:

import os
import time
import multiprocessing

def create_folder():
        path="C:\Users\HansPeterJonasHogh-J\dev\docs\pyhtonexercise\async_multi"
        os.chdir(path)
        fib_folder= 'fibFolder-01'
        # 避免文件夹已存在触发报错
        if not os.path.exists(fib_folder):
            os.makedirs(fib_folder)
        # 切换到目标文件夹,确保文件生成在指定目录
        os.chdir(fib_folder)

def generate_array(fib_position):
    fibarray=[1,] 
    num1 = 0
    num2 = 1
    current_index = 1
    fibnum=0
    while current_index < fib_position:
            fibnum = (num1+num2)
            num1 = num2
            num2 = fibnum
            current_index = (current_index+1)
            fibarray.append(int(fibnum))
    return(fibarray)

def write_file(fibarray):
    for X in range(1, len(fibarray) +1):
        with open(f"fib-number-{X}.txt", "w") as file:
            file.write(str(fibarray[:X]))
            # with上下文管理器会自动关闭文件,无需手动调用close()

if __name__== "__main__":
    fib_position = 7

    # 多进程逻辑
    st = time.time()

    p2 = multiprocessing.Process(target=generate_array, args=(fib_position, ))

    create_folder()
    p2.start()
    p2.join()  # 等待子进程执行完成,避免主进程提前结束导致计时不准

    en = time.time()
    print("time taken = ", en-st)

额外优化说明:

  • 补充了os、time、multiprocessing的导入语句(原代码缺失会触发其他报错)
  • 增加文件夹存在判断,避免重复创建报错
  • 切换到目标文件夹,确保文件生成在指定目录
  • 移除手动file.close(),利用with语句自动管理文件资源
  • 添加p2.join(),确保主进程等待子进程执行完毕再计算耗时

内容的提问来源于stack exchange,提问作者JnooriRS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:06:24