【问题标题】:Python name 'servers' is not definedPython 名称“服务器”未定义
【发布时间】:2021-10-12 09:56:07
【问题描述】:

我想创建一个 python 脚本来检查服务器上的服务器是否启动。相反,如果服务器启动与否,我想在文件中捕获该结果。最后,如果服务器出现故障,那么我想收到一封电子邮件。

我使用教程https://linuxhint.com/python-server-monitoring-script/ 开始创建python 文件,结果如下。

当我执行 python 文件时,出现以下错误。我对工人阶级不是很熟悉。所以我希望你能在这里帮助我。

$ C:/Users/../AppData/Local/Programs/Python/Python38/python.exe c:/Users/.../Documents/git/CV%20Reader%20FastAPI/CheckServer.py
Traceback (most recent call last):
  File "c:/Users/../Documents/git/CV%20Reader%20FastAPI/CheckServer.py",
line 77, in <module>
    servers.pickle.load(open("servers.pickle","rb"))
NameError: name 'servers' is not defined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:/Users/../Documents/git/../CheckServer.py",r.py", line 80, in <module>
    Server("serveradres",80,"plain","high"),
  File "c:/Users/../Documents/git/../CheckServer.py",r.py", line 12, in __init__
    self.name
AttributeError: 'Server' object has no attribute 'name'

代码

from os import system
import socket
import ssl
import pickle
from datetime import datetime, time
import subprocess
import platform

class Server():
    def __init__(self, name, port, connection, priority):
        self.name
        self.port
        self.connection
        self.priority
        
        self.history = []
        self.alert =  False

        def checkConnection(self):
            msg = ""
            succes = False
            now = datetime.now

            try:
                if self.connection == "plain":
                    socket.create_connection((self.name,self.port),timeout=10)
                    msg = f"{self.name} is up. On Port {self.port} with {self.connection}"
                    succes = True
                    self.alert = False
                elif self.connection == "ssl":
                    ssl.wrap_socket(socket.create_connection((self.name,self.port),timeout=10))
                    msg = f"{self.name} is up. On Port {self.port} with {self.connection}"
                    succes = True
                    self.alert = False
                elif succes == False and self.alert == False:
                    # Send Alert
                    self.alert = True
                    # email_alert(self.name,f"{msg}\n{now}","erik.hoeven@gmail.com")  
                else:
                    if self.ping():
                        msg = f"{self.name} Timout on Port {self.port} with {self.connection}"
                        succes = True
                        self.alert = False
                
                self.create_history(msg,succes,now)
            except socket.timeout:
                msg = f"{self.name} is Down. On Port {self.port}"
                succes = False
                alert = True
            
            except:
                pass

        def ping(self):
            try:
                output = subprocess.check_output("ping - {} 1 {}".format('n' if platform.system.lower() == 'windowns' else 'c', self.name), shell = True, universal_newlines = True)
                if 'unreachable'  in output:
                    return False
                
                else:
                    return True

            except Exception:
                return False

        def create_history(self,msg,succes,now):
            history_max = 100
            self.history.append((msg,succes,now))

            while len(self.history) > history_max:
                self.history.pop(0)

if __name__ == "__main__":
    try:
        servers.pickle.load(open("servers.pickle","rb"))
    except:
        servers = [
        Server("servername1",80,"plain","high"),
        Server("servername2",5001,"plain","high")]
    for server in servers:
        server.checkConnection()
        print(len(server.history))
        print(server.history[-1])

    pickle.dump(servers,open("serfvers.pickle","wb"))

【问题讨论】:

  • 您正在尝试访问servers,但您没有在它应该是什么之前声明
  • 你的意思是写servers = pickle.load(...而不是servers.pickle.load(...?!?

标签: python pickle


【解决方案1】:

您遇到的错误是因为在Server.__init__() 中您试图访问对象属性name,而不是为其分配具有相同名称的参数。您正在寻找:

class Server():
    def __init__(self, name, port, connection, priority):
        self.name = name
        ...

这同样适用于所有其他参数。

此外,成员函数的缩进存在问题,因为在您的代码的当前形式中,您定义的是 local 函数而不是类成员函数。要解决此问题,请减少其他(非初始化)方法的缩进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2018-02-24
    • 2021-10-18
    • 2016-05-16
    • 2013-01-26
    相关资源
    最近更新 更多