Python脚本执行时重复请求输入的问题及解决方法
问题原因
你遇到的重复输入问题,核心原因是Python导入模块时会执行模块的所有顶层代码:
- 第一次输入是直接运行
script1.py时,执行了开头的input代码; - 当
script1.py里的exec执行script2.py时,script2.py中的from script1 import a, b, c会触发Python重新加载并执行script1.py的顶层代码,于是又出现了第二次输入请求,两次输入对应两次输出。
解决方案
这里提供三种可行的修改方式,按需选择:
方案1:用if __name__ == '__main__'隔离执行代码
把script1.py中需要直接运行的代码(输入和exec)放到if __name__ == '__main__':块里,这样当script1被其他模块导入时,这部分代码不会执行,只有直接运行script1时才触发。
修改后的script1.py:
# 先定义变量,方便被导入 a = '' b = '' c = '' if __name__ == '__main__': a = input('enter value a - ') b = input('enter value b - ') c = input('enter value c - ') with open('script2.py') as script2: exec(script2.read())
script2.py保持不变即可。
方案2:通过exec上下文传递变量,避免导入
让script1在执行script2的代码时,把当前的变量传递过去,script2直接使用这些变量,不用再导入script1。
修改后的script1.py:
a = input('enter value a - ') b = input('enter value b - ') c = input('enter value c - ') with open('script2.py') as script2: # 把当前全局变量传递给exec的执行环境 exec(script2.read(), globals())
修改后的script2.py:
total_value = a + b + c print(total_value)
方案3:改用函数传递参数(最规范)
把script2的逻辑封装成函数,script1获取输入后直接调用这个函数并传入参数,完全避免模块导入时的代码执行问题。
修改后的script1.py:
import script2 a = input('enter value a - ') b = input('enter value b - ') c = input('enter value c - ') # 调用script2的函数并传入参数 script2.calculate_and_print(a, b, c)
修改后的script2.py:
def calculate_and_print(a, b, c): total_value = a + b + c print(total_value)
内容的提问来源于stack exchange,提问作者user23497777
相关产品推荐
相关产品推荐

