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
相关产品推荐
相关产品推荐

