You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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才能看到新值。

关键修改说明

  1. 全局变量初始化:在main.py顶部定义place = "",确保任何代码路径下这个变量都存在,不会报错。
  2. global关键字:在process_command里用global place声明,告诉函数使用全局变量,而不是创建同名的局部变量。
  3. 变量重置:在非导航命令或取消命令时重置place为空,避免保留旧的无效值。
  4. 跨文件访问:方案一通过函数参数传递变量,是最符合Python编码规范的方式;方案二适合快速测试全局变量的情况。

内容的提问来源于stack exchange,提问作者PickSoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:02:28