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

Python跨文件实现多线程时调用函数报NameError未定义如何解决

错误原因

  1. 你在调用makeThread(xxx)、执行xxx.start()以及打印xxx相关属性之前,没有在第二个文件的当前作用域里定义xxx这个变量,Python找不到对应变量就会抛出NameError。
  2. 你当前写的makeThread函数逻辑也存在问题:你把传入的xAMTLetter参数直接在函数内部重新赋值为新的Thread实例,这种修改不会同步到函数外部的原始变量,哪怕你提前定义了xxx传进去,外部的xxx还是空值,后续调用xxx.start()或者打印属性仍然会报错。

解决方法

第一步 修改makeThread函数,直接返回创建好的线程实例,废弃传入参数赋值的写法

将第一个文件中的makeThread修改为如下内容,注意提前导入所有依赖的模块、函数和全局变量:

import threading

def makeThread():
    getInfoOnThread()
    # 直接在函数内创建线程实例
    thread_obj = threading.Thread(target=thread_function, args=())
    thread_obj.Name = "Thread3"
    thread_obj.Key = getThreadInfo.ThreadKey
    thread_obj.ID = getThreadInfo.ThreadID
    threadsList.append(thread_obj)
    threadsIDList.append(thread_obj.ID)
    threadsNameList.append(thread_obj.Name)
    threadsKeyList.append(thread_obj.Key)
    # 返回创建好的线程实例给外部调用方
    return thread_obj

第二步 修改第二个文件代码,先接收makeThread返回的实例再使用

首先你原来的代码里x变量也没有提前定义,一并补充修改:

import threading
# 提前从第一个文件导入makeThread、thread_function、threadsList等所有跨文件使用的内容

# 补充x变量的定义
x = threading.Thread(target=thread_function, args=())
xx = threading.Thread(target=thread_function, args=())

getInfoOnThread()
x.Name = "Thread1"
x.Key = getThreadInfo.ThreadKey
x.ID = getThreadInfo.ThreadID
threadsList.append(x)
threadsIDList.append(x.ID)
threadsNameList.append(x.Name)
threadsKeyList.append(x.Key)

getInfoOnThread()
xx.Name = "Thread2"
xx.Key = getThreadInfo.ThreadKey
xx.ID = getThreadInfo.ThreadID
threadsList.append(xx)
threadsIDList.append(xx.ID)
threadsNameList.append(xx.Name)
threadsKeyList.append(xx.Key)

# 用xxx接收makeThread返回的线程实例,之后即可正常调用
xxx = makeThread()

x.start()
xx.start()
xxx.start()

for index, thread in enumerate(threadsList):
    thread.join()

print(f"Thread 1 info:\nName: {x.Name}\nKey: {x.Key}ID: {x.ID}\n")
print(f"Thread 2 info:\nName: {xx.Name}\nKey: {xx.Key}ID: {xx.ID}\n")
print(f"Thread 3 info:\nName: {xxx.Name}\nKey: {xxx.Key}ID: {xxx.ID}\n")

额外注意事项

  • 所有跨文件使用的函数、全局变量都要正确导入,避免出现其他未定义错误
  • 如果需要在函数内部修改全局变量的值,需要提前声明global 变量名,仅读取全局变量不需要加global声明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:01