如何在Python中访问while循环内的变量并跨文件导入打印
解决跨文件访问变量及未定义变量问题
嘿,我看了你的代码和需求,发现两个核心问题需要解决:一是原代码里直接print(place)会触发NameError(因为place只在导航分支里定义,没触发导航时根本不存在),二是跨文件访问变量的作用域问题。下面是修改后的完整方案:
修改后的main.py
import speech_recognition as sr import pyttsx3 import pywhatkit import subprocess import os import sys # 定义全局变量place,避免未定义报错,初始值设为空字符串 place = "" def restart_program(): python = sys.executable print(python) os.execl(python, python, *sys.argv) def speak(text): engine = pyttsx3.init() engine.say(text) engine.runAndWait() def get_audio(): r = sr.Recognizer() with sr.Microphone() as source: audio = r.listen(source) said = "" try: said = r.recognize_google(audio) print(said) except Exception as e: print("cancel") print("Exception: " + str(e)) return said.lower() def Task(): r = sr.Recognizer() with sr.Microphone() as source: audio = r.listen(source) said = "" try: print("listening...") said = r.recognize_google(audio) said = said.lower() if 'alexa' in said: command = said.replace("alexa", "") print(command) else: command = "null" except: command = "null" return command def process_command(command): global place # 声明使用全局变量place,避免创建局部变量 print(command) # 处理取消类命令时重置place if ('cancel' in command or 'nevermind' in command or 'forget it' in command): speak("Sorry.") place = "" # 处理播放歌曲命令 SONG_STRS = ["play a song", "sing"] for phrase in SONG_STRS: if phrase in command: speak("What would you like to play?") song = get_audio() place = "" # 非导航命令,重置place if ('cancel' in song or 'nevermind' in song or 'forget it' in song): speak("Sorry.") else: pywhatkit.playonyt(song) speak("I've done that.") # 处理导航命令 NAV_STRS = ["navigate me to", "start navigate", "let's go to"] for phrase in NAV_STRS: if phrase in command: speak("Where would you like to go?") place = get_audio() if ('cancel' in place or 'nevermind' in place or 'forget it' in place): speak("Sorry.") place = "" else: speak(f"Okay, let's go to {place}") print(f"当前导航地点(main内打印): {place}") # 处理重启命令 if 'restart' in command or 'reload' in command: speak("Cake and grief counseling will be available at the conclusion of the test.") restart_program() # 在函数末尾打印当前place的值 print(f"全局place变量值(main内打印): {place}") # 调用value.py的打印逻辑(对应方案一) import value value.print_place(place) while True: command = Task() process_command(command)
修改后的value.py(方案一:函数接收变量)
这种方式最稳妥,因为可以主动把最新的place变量传递过去:
def print_place(place): print(f"从main.py获取的place变量(value内打印): {place}")
备选方案二:直接访问全局变量(适合测试场景)
如果你想单独运行value.py查看main里的place值,可以这样写,但要确保main.py已经在运行:
import main # 打印main模块的全局place变量 print(f"从main.py获取的全局place变量(value内打印): {main.place}")
注意:这种方式下,value.py只能获取到运行时的place快照,如果main里的place后续更新,需要重新运行value.py才能看到新值。
关键修改说明
- 全局变量初始化:在main.py顶部定义
place = "",确保任何代码路径下这个变量都存在,不会报错。 global关键字:在process_command里用global place声明,告诉函数使用全局变量,而不是创建同名的局部变量。- 变量重置:在非导航命令或取消命令时重置
place为空,避免保留旧的无效值。 - 跨文件访问:方案一通过函数参数传递变量,是最符合Python编码规范的方式;方案二适合快速测试全局变量的情况。
内容的提问来源于stack exchange,提问作者PickSoul
相关产品推荐
相关产品推荐

