Python跨文件导入变量:避免触发源文件输入与执行逻辑
解决导入模块时重复触发输入的问题
核心问题出在Python的模块导入机制上:当你导入一个模块时,Python会执行该模块里所有的顶层代码,这就是为什么CCST_SUP.py导入CCST_Multi_Simp时,会弹出重复的输入请求——它把CCST_Multi_Simp里的input语句也执行了。
解决步骤
1. 重构CCST_Multi_Simp.py
把需要直接运行的逻辑(输入、循环启动子程序)放到if __name__ == "__main__":代码块里,这样只有直接运行这个文件时才会执行这些代码,导入时只会加载变量,不会触发输入和循环。
修改后的代码:
# 把变量放在顶层,导入时可以直接获取 Start = 1 Rep = 1000 import os if __name__ == "__main__": r0 = int(input('how many times to repeat program: ')) r1 = 0 code = "start cmd /k python C:\\Users\\anon\\OneDrive\\Desktop\\CCST\\CCST-SUP.py" while r0 != r1 or r1 > r0: os.system(code) Start += 1000 r1 += 1
2. 优化CCST_SUP.py的导入方式
明确导入需要的变量,不要用*,既清晰又避免导入冗余内容:
# 只导入需要的两个变量 from CCST_Multi_Simp import Start, Rep #First input value is your starting seed z = int(Start) #Second input is how many seeds after you want to test #Set r1 to -1 to test indefinatly (do not reccomend) #best to set r1 to 1 for higher numbers (youll see why if you dont know already) r1 = int(Rep) x = z y = 0 r0 = 0 #line break print(" ") #incase some smoothbrain doesnt read that i need two inputs if r1: print() print("ready") print() else: r1 = 1 print() print("ready") print() #Runs the loop for the number of seeds you want to test while r0 != r1: #used to determine which formula to use w = float(x % 2) #determines when to end testing if x != 1: #calculations for even numbers if w == 0: y = x / 2 x = y else: #calculation for odd numbers y = x * 3 + 1 x = y else: #sets up for the next seed print("<----------------------------->") print("End Of Seed", z) import time t = time.localtime() current_time = time.strftime("%H:%M:%S", t) print(current_time) z += 1 x = z r0 += 1 #past here is formatting for the end of program
原理说明
__name__是Python模块的内置变量:
- 当你直接运行一个模块时,
__name__的值是"__main__" - 当你把模块作为导入对象时,
__name__的值是模块的文件名(比如这里的CCST_Multi_Simp)
用if __name__ == "__main__":把执行逻辑包裹起来,就能区分模块是被直接运行还是被导入,从而避免导入时触发不必要的代码。
内容的提问来源于stack exchange,提问作者Yoke and Arrow
相关产品推荐
相关产品推荐

