我得到奇怪的NameError! 我有一个bash脚本,它检查CPU状态,将其放入文件(linux,btw),然后执行正在进行数学运算的python脚本,然后运行另一个脚本,检查哪个核心工作太辛苦,创建一个带有核心编号的文件(所以我可以稍后检查正确的核心是否仍然工作得太厉害了)然后在第一次核心达到90%以上时发送邮件。
现在,问题出在这里!当我运行“SendMail.py”脚本(将在下面添加)时,我得到NameError:未定义全局名称'smtplib'。 是的,我已经进口了它。当我在没有其他脚本午餐的情况下运行脚本时 - 一切正常,我收到了我的电子邮件!
所以 - 这是我的剧本......如果有人可以提供帮助,我会很高兴的。)
地平线。
#!/usr/bin/python
import os
import smtplib
with open("/linux/sendmail",'r') as nas_file:
success=nas_file.read()
print(success)
def send_mail(msg):
fromaddr = 'XXXXX'
toaddrs = 'XXXXX'
# Credentials (if needed)
username = 'XXXXX'
password = 'XXXXX'
# The actual mail send
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
return
if True:
send_mail(success)
回溯:
Traceback (most recent call last):
File "cpu_check.py", line 51, in <module>
scancores()
File "cpu_check.py", line 35, in scancores
execfile("SendMail.py")
File "SendMail.py", line 25, in <module>
send_mail(success)
File "SendMail.py", line 18, in send_mail
server = smtplib.SMTP('smtp.gmail.com:587')
NameError: global name 'smtplib' is not defined
答案 0 :(得分:1)
由于以下代码的原因相同:
class Test:
import math
def fn():
print(math.sin(1))
fn() # NameError: name 'math' is not defined
execfile(filename [,globals [,locals]])
...
参数是文件名和两个可选字典。文件 被解析并评估为一系列Python语句(类似地 使用 globals 和 locals 字典作为全局和模块) 本地命名空间如果提供, locals 可以是任何映射对象。 请记住,在模块级别,全局变量和局部变量是相同的 字典。如果将两个单独的对象作为 globals 和 locals 传递, 代码将被执行,就像它嵌入在类中一样 定义
在版本2.4中更改:以前本地人必须是一个 字典。
如果省略 locals 字典,则默认为 globals 字典。如果省略两个字典,则表达式为 在调用
execfile()
的环境中执行。回报 值为None
。
我假设您没有为execfile指定任何其他参数,因此全局变量和本地变量默认为当前执行环境,其基本上与上面的Test
类相似。
如何解决这个问题?不要使用execfile
。请改用模块或subprocess.call:
# SendMail.py
#!/usr/bin/python
import os
import smtplib
def send_mail(msg):
...
def run():
with open("/linux/sendmail",'r') as nas_file:
success=nas_file.read()
print(success)
send_mail(success)
if __name__ == "__main__":
run()
# cpu_check.py
import SendMail
...
SendMail.run() # instead of execfile("SendMail.py")