如何在Python中无需传参让脚本1调用脚本2的变量
问题解决:让script1无需传参直接使用script2的变量
首先明确你的问题:script1里的one()函数试图访问name、last、job这些变量,但这些变量默认只会在script1自己的全局命名空间里查找,而你定义的变量在script2的全局空间中,直接运行会报变量未定义的错误。下面给你几种不用传参就能解决的实用办法:
方法1:让script1读取调用者的全局变量
借助inspect模块获取调用栈,拿到script2的全局变量字典,这样函数就能直接调用script2里的变量。
修改后的script1.py:
import os import re import inspect def one(): # 获取调用者(script2)的全局变量 caller_globals = inspect.stack()[1][0].f_globals # 从调用者的全局变量中取值,没取到就用默认值 name = caller_globals.get('name', '未知') last = caller_globals.get('last', '未知') job = caller_globals.get('occupation', '未知') # 注意你script2里的变量名是occupation,不是job print(f"First Name: {name}") print(f"Last Name: {last}") print(f"Occupation: {job}")
script2.py保持原样即可:
import os import re import script1 name = "Rob" last = "Sussian" occupation = "Unemployee" script1.one()
方法2:把script2的变量注入到script1的命名空间
在script2里导入script1后,直接把变量赋值给script1模块的全局变量,让script1的函数能直接访问。
修改后的script2.py:
import os import re import script1 name = "Rob" last = "Sussian" occupation = "Unemployee" # 将script2的变量赋值给script1模块 script1.name = name script1.last = last script1.job = occupation # 对应script1里的job变量名 script1.one()
script1.py可以保留你原来的代码(注意统一变量名,避免不匹配):
import os import re def one(): print("First Name: " + name) print("Last Name: " + last) print("Occupation: " + job)
方法3:用配置类(更规范的写法)
这种方式稍微调整结构,但变量管理更清晰,符合Python编码习惯,适合后续扩展。
script1.py:
import os import re # 定义一个全局配置类,用来存需要共享的变量 class Config: name = "" last = "" occupation = "" def one(): print(f"First Name: {Config.name}") print(f"Last Name: {Config.last}") print(f"Occupation: {Config.occupation}")
script2.py直接修改配置类的属性:
import os import re import script1 # 给script1的Config类赋值 script1.Config.name = "Rob" script1.Config.last = "Sussian" script1.Config.occupation = "Unemployee" script1.one()
小提醒
- 方法1不用改太多代码,但依赖调用栈,调试时可能不够直观;
- 方法2简单直接,但变量多了会显得杂乱,容易和script1自身变量冲突;
- 方法3最规范,变量管理清晰,推荐长期使用。
内容的提问来源于stack exchange,提问作者Itsme
相关产品推荐
相关产品推荐

