實現服務器數據採集腳本技術點總結

    上週對服務器數據採集腳本進行了優化和改進,在作的過程當中遇到了一些問題,學到了一些知識點,如今總結出來,以供後續學習參考,歡迎你們批評指正,共同窗習進步!
html


1、從別的目錄導入模塊的兩種方式python

    方式1、  mysql

    sys.path.append(「想要導入的文件的存放目錄」)
    import 模塊名

    方式2、sql

        在文件夾創建一個空文件__init__.py文件,使文件夾變爲一個包;而後使用os模塊調整此文件所在的路徑,使其在所要訪問的包的上一級目錄shell

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)

                而後就能夠導入所想要導入的模塊了數據庫


2、python操做mysql數據庫json

  import MySQLdb

    一、對數據庫執行增、刪、改操做    api

    def exec_curr(sql):
        try:
        #打開數據庫鏈接
      cnn=MySQLdb.connect(host=host,port=port,user=db_user,passwd=db_passwd,charset='utf8',db=db)
      #使用cursor()方法獲取操做遊標
      cur=cnn.cursor()
      #使用execute方法執行SQL語句
      cur.execute(sql)
      cnn.commit()
    except MySQLdb.Error,e:
      print e

    二、對數據庫執行查詢操做服務器

    def connet_curr(host=host,port=port,db=db,db_user=db_user,db_passwd=db_passwd,sql="select ip from nosql_ip"):
        result=[]
    try:
        cnn=MySQLdb.connect(host=host,port=port,user=db_user,passwd=db_passwd,charset='utf8',db=db)
        cur = cnn.cursor()
        cur.execute(sql)
        #獲取全部記錄列表
        rows=cur.fetchall()
        for row in rows:
            result.append(row)
        return result
    except MySQLdb.Error,e:
        print e


3、python的序列化和反序列化app

    在作數據採集的時候,用到了公司其餘部門同事作好的api,從api取到的數據爲字符串格式,須要經過loads轉換一下,成爲字典格式以方便操做(固然,這裏不轉化爲字典的話,可使用操做字符串的方式進行操做,但使用字典方式更加方便和準確)

    一、可使用pickle模塊

    pickle.dumps(dic)
    pickle.loads(byte_data)

    二、可使用json模塊(我這裏用到的是json)

    str = json.dumps(dic)
    dic_obj = json.loads(dic_str)

spacer.gif

4、操做字典的方式方法(字典是無序的,字典的key必須惟一)

 

  假設字典爲 info = {'staff1': "小明",'staff2': "小紅",'staff3': "小李"}
    一、增長操做
        info['staff4'] = 「小劉」
    二、修改操做
        info['staff3'] = "小樊"
    三、刪除操做
          1)info.pop("staff1")
      2)del info['staff3']
    四、查詢操做
      1)"staff2" in info
      2)info.get("staff2")  若是一個key不存在,只返回None
      3)info["staff2"]   若是一個key不存在,就報錯
    五、嵌套字典的查詢只須要 :字典名[ ][ ] . . .
    六、循環字典
     1)for key in info:
          print(key,info[key])
     2)for k,v in info.items(): #會先把dict轉成list
         print(k,v)


5、經過ssh鏈接到其餘服務器執行命令的方法

    def    ssh_execute_shell(host,command):                                  
      ssh_shell = ( '''/usr/bin/ssh -n -i 跳板機的私鑰地址 -p 26387 -o '''
              '''StrictHostKeyChecking=no -o ConnectTimeout=2 root@'%s' '''
              ''' "%s" ''' % (host, command))
        p=subprocess.Popen(ssh_shell,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        out = p.communicate()
        return out


6、python的多進程

    一、多進程使用模塊

    from multiprocessing import Process
  import time
  def f(name):
      time.sleep(2)
    print('hello', name)
  if __name__ == '__main__':
      p = Process(target=f, args=('process1',))
    p.start()
    p.join()

    二、因爲進程間內存不共享,進程間共享數據的方式有如下幾種

        Queues(消息隊列)

        Pipes(管道)

        Managers

    三、進程池

    from multiprocessing import Process,Pool
  import time
  def Foo(i):
      time.sleep(2)
      return i+100
  pool = Pool(5)
  for i in range(10):
      pool.apply_async(func=Foo, args=(i,))
      #pool.apply(func=Foo, args=(i,))
  pool.close()
  pool.join()#進程池中進程執行完畢後再關閉,若是註釋,那麼程序直接關閉。


7、使用python發郵件

    import smtplib
  from email.MIMEText import MIMEText
  mailto_list = ["收件人用戶名@staff.sina.com.cn"]
  mail_host = "mail.staff.sina.com.cn"
  mail_user = "發件人用戶名"
  mail_pass = "發件人郵箱密碼"
  mail_postfix = "staff.sina.com.cn"
  def send_mail(to_list, sub, content):
    me = "hello" + "<" + mail_user + "@" + mail_postfix + ">"
    msg = MIMEText(content, _subtype='html', _charset='UTF-8')
    msg['Subject'] = sub
    msg['From'] = me
    msg['To'] = ";".join(to_list)
    try:
      s = smtplib.SMTP()
      s.connect(mail_host)
      s.login(mail_user, mail_pass)
      s.sendmail(me, to_list, msg.as_string())
      s.close()
      return True
    except Exception as e:
      print str(e)
      return False


                                                                                    歡迎批評指正!

相關文章
相關標籤/搜索