这本书买了一段时间,但是全英文的,开始看起来有些困难。由于写python已经比较久了,所以在看的时候感觉轻松多了。此书对于系统工程师还是非常有用处的。但是粗略查看后当字典用,如果学习使用还不是很合适。
11月
17
很早写的,本来觉得意义不大,还是放上来,以备丢了。python2.6下发送通过。
#!/bin/env python # -*- coding:utf-8 -*- # ------------------------------------------------------------------------------- # Filename: sendmail.py # Revision: 1.0 # Date: 2012-7-18 # Author: simonzhang # Email: simon-zzm@163.com # Web: www.simonzhang.net # ------------------------------------------------------------------------------- import smtplib from email.mime.text import MIMEText # mail_host = 'smtp.exmail.qq.com' mail_user = 'XXXXXXXX' mail_pwd = 'XXXXXXXXX' def mail_send(content, mailto, get_sub): msg = MIMEText(content.encode('utf8'), _subtype='html', _charset='utf8') msg['From'] = mail_user msg['Subject'] = u'%s' % get_sub msg['To'] = mailto try: s = smtplib.SMTP() s.connect(mail_host) s.login(mail_user,mail_pwd) s.sendmail(mail_user,[mailto],msg.as_string()) s.close() except Exception ,e: print e
之前在tornado学习中(一)中,写了一个启停的脚本,来启动多个端口,但是其中没有日志部分。我将脚本修改一下,使其能支持启动输出日志。具体可见早起笔记http://www.simonzhang.net/?p=1170
#!/bin/sh # # Filename: main.sh # Revision: 1.1 # Date: 2012-09-27 # Author: simonzhang # web: www.simonzhang.net # Email: simon-zzm@163.com # ### END INIT INFO # Source function library. . /etc/profile # Set the base value listen_line=1 listen_start=8000 ## info|warning|error|none loglevel='info' log_file_prefix='logs/pypixshow.log' log_file_max_size=20480 # CWD=`pwd` cd $CWD # See how we were called. case "$1" in start) /bin/rm -rf main.port for (( i=0 ; i<${listen_line} ; i++)); do listen_port=$[${listen_start}+${i}] echo ${listen_port} >> main.port python main.py ${listen_port} ${loglevel} ${log_file_prefix} ${log_file_max_size} & done echo "start ok !" ;; stop) get_port_line=`/bin/cat main.port` for i in ${get_port_line};do now_pid=`/bin/ps -ef|grep ${i}|grep -v grep|awk ' ''{print $2}'` /bin/kill -9 $now_pid done /bin/rm -rf *.pyc echo "stop" ;; status) get_port_line=`/bin/cat main.port` for i in ${get_port_line};do now_pid=`/bin/ps -ef|grep ${i}|grep -v grep` if [ -z "${now_pid}" ] ; then echo ${i} "is stop" else echo ${now_pid} fi done ;; restart) $0 stop $0 start ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac exit $rc
main.py 也需要修改,下面简单列出日志相关的代码。
import tornado.options import logging if __name__ == "__main__": listen_port = sys.argv[1] tornado.options.options['logging'].set(sys.argv[2]) tornado.options.options['log_file_prefix'].set(sys.argv[3]) tornado.options.options['log_file_max_size'].set(int(sys.argv[4])) tornado.options.parse_command_line() application.listen(listen_port) tornado.ioloop.IOLoop.instance().start()
使用python+tornado,在数据库中根据用户id取用户名出错了。经查看是由于,手动删除了值,什么数据都没有取回,所以报错。这个用try是不行的,也不想用import types,搞个简单的,使用if判断一下,出错的人都叫“haha”。
_get_user_name = db_get_user(userid) if type(_get_user_name) == type(None): _get_user_name = "haha"
在学习go语言,所以当前的需求使用go来试验一下。需要:循环检查某些url并返值,并获取所用时间,如果返回内容长度超过100个字节,只显示前100个字节,不足100个字节显示全部。我将url写在url.txt文件中,方便以后增加。
在centos 5.4下go1.0.2编译通过。虽然编译通过,但是个人感觉还是不如python方便,并且变异出来的东西都快3M了,让我想起了当年的delphi。如果这种监测实验脚本还是首选python。但是用python做有个问题,如果使用“while 1”循环使用urllib2获取,时间一长就失败过多。具体原因没有查,直接用crontab或脚本调用解决。
package main import ("fmt" "os" "net/http" "io/ioutil" "time" ) func main() { var str string userFile := "url.txt" fin,err := os.Open(userFile) defer fin.Close() if err != nil { fmt.Println(userFile,err) return } buf := make([]byte, 1) // for{ n,_:= fin.Read(buf) if 0==n {break} if string(buf)=="\n"{ //开始通过url获得页面 starttime:=time.Now().Unix() res, err := http.Get(str) endtime:=time.Now().Unix() usetime:=endtime-starttime if err != nil { fmt.Println(err) } context, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) } res.Body.Close() // 获得完毕打印 if len(context) >100{ fmt.Println(string(context)[:100]) } else { fmt.Println(string(context)) } fmt.Println("get url:", str, " use time :", usetime) str="" } else { str+=string(buf) } } }