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