import pyttsx
import random
import os
import serial
import webbrowser
while True:
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
engine = pyttsx.init()
portport()
if(msg == 'mof'):
engine.say('Are you sure?')
engine.runAndWait()
portport()
if(msg == 'yes'):
engine.say('Chrome has now closed')
os.system("TASKKILL /F /IM chrome.exe")
engine.runAndWait()
elif(msg == 'noo'):
engine = pyttsx.init()
engine.say('Are you kidding me?')
engine.runAndWait()
if(msg == 'hi_'):
greeting()
if(msg == 'bye'):
leaving()
if(msg == 'who'):
engine = pyttsx.init()
engine.say('Hi there')
engine.runAndWait()
if(msg == 'lik'):
engine = pyttsx.init()
engine.say('Ofcourse I do!')
engine.runAndWait()
我的问题是,如果不是创建def(portport()
)并在需要时调用它,一切都有效,我只需编写包含在此def中的代码。我曾经使用过(但是没有把它放在这里,因为我不希望它是一段很长的代码)其他函数(例如greeting()
)并且它工作得很好。
Eclipse使用上述代码时的控制台"说":
Traceback (most recent call last):
File "C:\Users\xxx\eclipse\workspace\Ai_Project\Ai\Ai_Brain.py", line 126, in <module>
if(msg == 'mof'):
NameError: name 'msg' is not defined
每个if(msg == 'something'):
变成红色
我已经在这里和所有地方阅读了很多帖子,但似乎不是一个python函数问题
回答: 谢谢大家的回答,以及mhawke的回答。 代码在必须根据您的建议进行的机会之后工作。为了将来使用,更新的代码是:
.....
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
while True:
engine = pyttsx.init()
msg = portport()
if(msg == 'mof'):
engine.say('Are you sure?')
engine.runAndWait()
msg = portport()
if(msg == 'yes'):
engine.say('Chrome has now closed')
os.system("TASKKILL /F /IM chrome.exe")
engine.runAndWait()
elif(msg == 'noo'):
engine = pyttsx.init()
engine.say('Are you kidding me?')
engine.runAndWait()
......
答案 0 :(得分:1)
msg
仅在portport
函数中定义。如果要在外部使用它,则需要从那里返回它,并将其分配给局部变量。
注意,你不应该在while循环中使用你的函数定义。
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
while True:
engine = pyttsx.init()
msg = portport()
if msg == 'mof':
...
另请注意,您不需要围绕Python条件的括号。
答案 1 :(得分:1)
msg
是portport()
中的局部变量,因此无法在外部访问。
答案 2 :(得分:0)
您的msg变量的范围不正确。
import pyttsx
import random
import os
import serial
import webbrowser
while True:
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
engine = pyttsx.init()
msg = portport()
if(msg == 'mof'):
engine.say('Are you sure?')
engine.runAndWait()
portport()
if(msg == 'yes'):
engine.say('Chrome has now closed')
os.system("TASKKILL /F /IM chrome.exe")
engine.runAndWait()
elif(msg == 'noo'):
engine = pyttsx.init()
engine.say('Are you kidding me?')
engine.runAndWait()
if(msg == 'hi_'):
greeting()
if(msg == 'bye'):
leaving()
if(msg == 'who'):
engine = pyttsx.init()
engine.say('Hi there')
engine.runAndWait()
if(msg == 'lik'):
engine = pyttsx.init()
engine.say('Ofcourse I do!')
engine.runAndWait()
答案 3 :(得分:0)
问题是,在使用该功能时,msg
是portport()
的本地变量。该变量在函数外部不可用。因此,从函数外部对它的引用会导致NameError
异常。
在行msg
中声明的范围与if
语句中对它的引用相同,因此没有问题。
使用该函数时纠正此问题的一种方法是让函数返回 msg
的值:
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
然后调用portport()
并将返回值分配给变量msg
:
msg = portport()
现在,在与引用它的msg
语句相同的范围内创建一个新变量if
。
N.B。不要将函数内部的msg
与函数外部的函数混淆 - 它们是不同的变量,因为它们存在于不同的范围内。