NameError不是名称错误!蟒蛇

时间:2016-06-13 06:53:30

标签: python python-3.x smtplib

我得到奇怪的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

1 个答案:

答案 0 :(得分:1)

由于以下代码的原因相同:

class Test:
  import math
  def fn():
    print(math.sin(1))
  fn() # NameError: name 'math' is not defined

来自documentation of execfile

  

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")