Python脚本无限重复执行初始判断语句,求解决及跨脚本变量传递方案
Python脚本无限重复执行初始判断语句,求解决及跨脚本变量传递方案
嘿,你遇到的这个无限循环问题,根源其实是循环执行/循环导入导致的!我来给你拆解下:你的start_game.py用os.system启动了login.py,但如果login.py里又导入了start_game(哪怕只是导入newPlayer变量),Python就会把start_game.py里的所有顶层代码重新执行一遍——包括判断存档、打印欢迎语、再启动login.py这一串操作,这不就无限套娃了嘛!
接下来给你两个层面的解决方案:先搞定无限循环,再解决newPlayer变量的跨脚本传递问题。
一、先解决无限循环问题(核心是避免重复执行整个脚本)
别用os.system来启动另一个脚本了,这种方式会新开一个Python进程,而且完全没法优雅地传递变量。推荐用模块导入+函数调用的方式,把login.py的核心逻辑封装成函数,直接在start_game.py里调用就行。
二、跨脚本传递newPlayer变量的最优方案
方案1:函数参数传递(最推荐,代码耦合度低,逻辑清晰)
- 先改造
core/login.py,把所有登录相关的代码塞进一个函数里,接收new_player作为参数:
# core/login.py def run_login(new_player): # 把原来login.py里的所有代码都移到这里 if new_player: print("欢迎新玩家,这是为你准备的引导流程~") else: print("欢迎回来,直接进入登录环节!") # 这里写你的登录逻辑,比如账号验证、角色加载等等...
- 再修改
start_game.py,去掉os.system,改成导入并调用这个函数:
import os, logging # 直接导入login.py里的run_login函数 from core.login import run_login saveFilePath = 'save_the_world.txt' logging.basicConfig(filename='game.log', level='DEBUG', format='%(asctime)s - %(levelname)s - %(message)s') if os.path.exists(saveFilePath): print("Save file found! Welcome back.") newPlayer = False else: with open(saveFilePath, 'x') as f: f.write("Save file placeholder text.") print("Welcome, new player (or deleter of save files)!") newPlayer = True # 直接调用登录函数,把newPlayer传过去 run_login(newPlayer)
方案2:命令行参数传递(适合必须分开启动进程的场景)
如果因为某些原因,你必须让两个脚本作为独立进程运行,可以通过命令行参数传递newPlayer的值:
- 修改
start_game.py,用subprocess替代os.system(subprocess比os.system更安全灵活):
import os, logging, subprocess, sys saveFilePath = 'save_the_world.txt' logging.basicConfig(filename='game.log', level='DEBUG', format='%(asctime)s - %(levelname)s - %(message)s') if os.path.exists(saveFilePath): print("Save file found! Welcome back.") newPlayer = 'False' else: with open(saveFilePath, 'x') as f: f.write("Save file placeholder text.") print("Welcome, new player (or deleter of save files)!") newPlayer = 'True' # 通过命令行参数传递newPlayer的值 subprocess.run([sys.executable, 'core/login.py', newPlayer])
- 然后在
core/login.py里读取命令行参数:
import sys # 读取传递过来的参数,注意sys.argv[0]是脚本路径,sys.argv[1]才是我们传的参数 new_player = sys.argv[1] == 'True' if new_player: print("新玩家专属登录流程启动") else: print("老玩家快速登录通道开启")
最后再给你补个知识点:为什么之前from start_game import newPlayer没用?因为当你在login.py里导入start_game的任何内容时,Python都会执行start_game.py里的所有顶层代码(就是不在函数里的代码),这就导致start_game.py又会启动login.py,形成无限循环。所以一定要把可执行的逻辑放进函数里,只有被调用的时候才执行,而不是顶层直接跑~
备注:内容来源于stack exchange,提问作者Phoenix Rise
相关产品推荐
相关产品推荐

