Python跨文件实现多线程时调用函数报NameError未定义如何解决
错误原因
- 你在调用
makeThread(xxx)、执行xxx.start()以及打印xxx相关属性之前,没有在第二个文件的当前作用域里定义xxx这个变量,Python找不到对应变量就会抛出NameError。 - 你当前写的
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
相关产品推荐
相关产品推荐

