无法从其他Python文件调用变量?排查a.py与b.py的报错问题
Python模块导入报错:问题分析与修复方案
首先,咱们先把你的两个文件代码贴出来,方便定位问题:
a.py
#!/usr/bin/env python # coding=utf-8 CHOOSE = input (''' \033[1;35m choose 1 or 2:\033[0m 1)tom 2)jack ''') a = 666 b = "bbb" def f(): print("this is a test") return "function" if __name__ == '__main__': if CHOOSE == '1': username = 'tom' print(username) elif CHOOSE == '2': username = 'jack' print(username) else: print('wrong choice,scipt is exit...')
b.py
#!/usr/bin/env python # coding=utf-8 import a from a import b,f,CHOOSE,username a = a.a f() print(b,a,CHOOSE,username)
问题出在哪?
当你运行python b.py时,核心报错原因有两个:
username变量未定义(模块导入时不会执行if __name__ == '__main__'代码块)
在Python里,当一个.py文件被作为模块导入时,文件中if __name__ == '__main__':包裹的代码是不会执行的。你的username变量正是定义在这个代码块里,所以当b.py尝试from a import username时,Python找不到这个变量,直接抛出ImportError。命名冲突(非直接报错,但需注意)
你在b.py里写了a = a.a,这会把原本指向模块a的变量a覆盖成模块里的a值(666),后续如果想再调用模块a的其他属性就会出问题,建议换个变量名,比如a_val = a.a。
怎么修复?
根据你的需求,有两种常见的修复方式:
方式一:让模块也能获取username(如果b.py确实需要这个变量)
把username的定义逻辑移到if __name__ == '__main__':外面,或者封装成函数。比如修改a.py:
#!/usr/bin/env python # coding=utf-8 def get_username(): CHOOSE = input (''' \033[1;35m choose 1 or 2:\033[0m 1)tom 2)jack ''') if CHOOSE == '1': return 'tom' elif CHOOSE == '2': return 'jack' else: print('wrong choice,scipt is exit...') exit() a = 666 b = "bbb" def f(): print("this is a test") return "function" if __name__ == '__main__': username = get_username() print(username)
然后修改b.py,调用函数获取username:
#!/usr/bin/env python # coding=utf-8 import a from a import b,f,get_username a_val = a.a username = get_username() f() print(b,a_val,username)
方式二:b.py不需要username,只导入需要的变量
如果你的b.py其实用不到username,那直接去掉对它的导入即可:
#!/usr/bin/env python # coding=utf-8 import a from a import b,f,CHOOSE a_val = a.a f() print(b,a_val,CHOOSE)
这样运行python b.py就不会报错啦~
内容的提问来源于stack exchange,提问作者ChrisChan
相关产品推荐
相关产品推荐

