python利用ansible磁盘检测报警

采菊篱下 发表了文章 • 0 个评论 • 1249 次浏览 • 2015-09-24 15:16 • 来自相关话题

简单的利用python调用ansible检测内网服务器磁盘,然后报警,看代码吧,写得有点糙,很多地方都没有考虑异常抛出,和处理,暂时能用就行,The following code:

#!/usr/bin/env python
# encoding: utf-8
#Author: Lucky chen

import datetime,time,traceback
import smtplib,os,re
import threading
from string import join

def sendmail(subject='', msg='', fromaddr='lucky@hadoope.com', toaddrs=):
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
mail_msg = MIMEMultipart()
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
#print mail_msg.as_string()
try:
[size=16]# Intranet mail server[/size]
s = smtplib.SMTP('10.3.8.2')
s.sendmail(fromaddr, toaddrs, mail_msg.as_string())
s.quit()
except:
error_result = traceback.format_exc()
print error_result


def check_sendmail(zn,hn):
#The recipient email
mailto_list=['ronghua@139.com', 'lucky@hadoope.com']
f = '%'
mail_content = "host %s %s zone used gt 95%s" % (hn, zn, f)
sub = "online host Disk usage"
sendmail(subject=sub, msg=mail_content, toaddrs=mailto_list)


def check_result(cmd,hname):
resu = os.popen(cmd).read().strip().split()
#print resu
#To obtain / /data zone Pointer to the location
rnum, dnum = resu.index("/") - 1 , resu.index("/data") - 1
[size=16] get root /data zone % num[/size]
rzone, dzone = int(resu[rnum].split('%')[0]), int(resu[dnum].split('%')[0])
#print type(rzone)
#print rzone,dzone,hname

if rzone > 95:
check_sendmail(zn="/",hn=hname)
if dzone > 95:
check_sendmail(zn='/data',hn=hname)

if __name__=='__main__':
[size=16]ansible host list /etc/ansible/hosts[/size]
host=['web1','web2','db1','db2']
for dest in host:
comm = "ansible %s -m shell -a 'df -h'" % (dest)
#print comm
#check_result(cmd=comm,hname=dest)
s = threading.Thread(target = check_result,args = (comm,dest))
s.start() 查看全部
python.png


简单的利用python调用ansible检测内网服务器磁盘,然后报警,看代码吧,写得有点糙,很多地方都没有考虑异常抛出,和处理,暂时能用就行,The following code:


#!/usr/bin/env python
# encoding: utf-8
#Author: Lucky chen

import datetime,time,traceback
import smtplib,os,re
import threading
from string import join

def sendmail(subject='', msg='', fromaddr='lucky@hadoope.com', toaddrs=):
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
mail_msg = MIMEMultipart()
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
#print mail_msg.as_string()
try:
[size=16]# Intranet mail server[/size]
s = smtplib.SMTP('10.3.8.2')
s.sendmail(fromaddr, toaddrs, mail_msg.as_string())
s.quit()
except:
error_result = traceback.format_exc()
print error_result


def check_sendmail(zn,hn):
#The recipient email
mailto_list=['ronghua@139.com', 'lucky@hadoope.com']
f = '%'
mail_content = "host %s %s zone used gt 95%s" % (hn, zn, f)
sub = "online host Disk usage"
sendmail(subject=sub, msg=mail_content, toaddrs=mailto_list)


def check_result(cmd,hname):
resu = os.popen(cmd).read().strip().split()
#print resu
#To obtain / /data zone Pointer to the location
rnum, dnum = resu.index("/") - 1 , resu.index("/data") - 1
[size=16] get root /data zone % num[/size]
rzone, dzone = int(resu[rnum].split('%')[0]), int(resu[dnum].split('%')[0])
#print type(rzone)
#print rzone,dzone,hname

if rzone > 95:
check_sendmail(zn="/",hn=hname)
if dzone > 95:
check_sendmail(zn='/data',hn=hname)

if __name__=='__main__':
[size=16]ansible host list /etc/ansible/hosts[/size]
host=['web1','web2','db1','db2']
for dest in host:
comm = "ansible %s -m shell -a 'df -h'" % (dest)
#print comm
#check_result(cmd=comm,hname=dest)
s = threading.Thread(target = check_result,args = (comm,dest))
s.start()

Python系统信息模块Psutil介绍

采菊篱下 发表了文章 • 0 个评论 • 3151 次浏览 • 2015-09-23 00:52 • 来自相关话题

   
     psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU 、内存、磁盘、网络等)信息,它主要应用于系统监控,分析和限制系统资源以及进程的管理。它可以实现等同于命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和SunSolaris等操作系统,支持从2.4到3.4的python版本,目前最新版本为2.0.0。
 
    通常我们获取操作系统信息往往采用编写shell脚本来实现,如获取当前系统的物理内存总大小和使用大小,shell命令如下:物理内存total值: free -m |grep Mem |awk ‘{print $2}’
物理内存used值:free -m |grep Mem | awk ‘{print $3}’    相比较而言,使用psutil库实现起来就更加简单了。psutil大小单位一般采用字节(Byte),如下:>>> import psutil
[quote]>> mem = psutil.virtual_memory()
>>> mem.total,mem.used
(8361156608L, 8215703552L)
转换成M为单位的话可以如下:
>>> print mem.total/1024/1024,mem.used/1024/1024
7973 7835

psutil的安装

    centos下:[root@crh]#yum search python |grep psutil
python26-psutil.x86_64 : A process and system utilities module for Python
所以我只需要yum -y install python26-psutil 就可以了    源码安装:[root@crh]#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz
[root@crh]#tar zxf psutil-2.0.0.tar.gz
[root@crh]#cd psutil-2.0.0
[root@crh]#python setup.py install
安装完成后,进入到python交互模式你可以导入试试。。。。

获取系统性能信息

    采集系统的基本性能信息包括(cpu、内存、磁盘、网络等,可以完整描述当前系统的运行的状态以及质量。psutil模块已经封装好了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用,那我们就开始来学习吧。走起。。。。。
 
1.CPU信息
    Linux操作系统的CPU利用率主要有以下几个部分:
[]User Time, 执行用户进程的时间百分比;[/][]System Time,执行内核进程和中断的时间百分比;[/][]Wait IO, 由于IO等待而让CPU处于idle(空闲)状态的时间百分比;[/][]Idle, CPU处于idle状态的时间百分比。[/]
    我们使用Python的psutil.cpu_times()方法可以非常简单的获取到这些信息,同时也可以获取到CPU的硬件相关的信息,比如CPU的物理个数和逻辑个数,具体看下面的操作例子:>>> import psutil
>>> psutil.cpu_times() [size=16]使用cpu_items方法获取CPU完整信息[/size]
cputimes(user=202656.94, nice=0.85999999999999999, system=83652.119999999995, idle=10823517.810000001, iowait=1242.27, irq=632.41999999999996, softirq=8720.3500000000004)[/quote]

[quote]>> psutil.cpu_times(percpu=True) #[size=16]#显示所有逻辑CPU的信息,指定percpu=True就好[/size]
[cputimes(user=8798.4200000000001, nice=0.029999999999999999, system=4920.2399999999998, idle=1376294.9399999999, iowait=40.539999999999999, irq=0.01, softirq=24.239999999999998), cputimes(user=35990.419999999998, nice=0.20000000000000001, system=13513.059999999999, idle=1338291.54, iowait=431.29000000000002, irq=95.420000000000002, softirq=1756.3499999999999), cputimes(user=23382.98, nice=0.080000000000000002, system=9391.4300000000003, idle=1356101.8899999999, iowait=102.27, irq=48.829999999999998, softirq=1050.73), cputimes(user=36171.690000000002, nice=0.28999999999999998, system=13764.790000000001, idle=1337939.1399999999, iowait=383.88, irq=91.719999999999999, softirq=1726.6199999999999), cputimes(user=9241.1200000000008, nice=0.070000000000000007, system=5088.5100000000002, idle=1375672.72, iowait=36.68, irq=0.01, softirq=38.950000000000003), cputimes(user=35656.849999999999, nice=0.089999999999999997, system=13522.209999999999, idle=1339042.3700000001, iowait=114.27, irq=84.890000000000001, softirq=1657.29), cputimes(user=17315.099999999999, nice=0.0, system=9599.6100000000006, idle=1362112.8, iowait=28.25, irq=224.88999999999999, softirq=797.25999999999999), cputimes(user=36109.360000000001, nice=0.070000000000000007, system=13855.99, idle=1338251.4299999999, iowait=105.06999999999999, irq=86.640000000000001, softirq=1669.28)][/quote]

[quote]>> psutil.cpu_times().user [size=16]# 获取CPU的但单项数据,如用户的CPU时间比[/size]
202673.82000000001[/quote]

[quote]>> psutil.cpu_count() [size=16]#获取cpu逻辑个数,默认logical=True ****注释如果你的psutil的版本不对的话可能没有cpu_count这个方法[/size][/quote]

8

[quote]>> psutil.cpu_count(logical=False) [size=16]#获取cpu的物理个数[/size][/quote]

12.内存信息
    Linux 系统的内存信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取到这些信息。>>> mem = psutil.virtual_memory() #使用psutil.virtual_memory方法获取内存完整信息

[quote]>> mem[/quote]

svmem(total=8361156608L, available=5626871808L, percent=32.700000000000003, used=8166158336L, free=194998272L, active=2812674048, inactive=4402806784, buffers=290136064L, cached=5141737472)

[quote]>>[/quote]

[quote]>> mem.total/1024/1024 #获取内存总数[/quote]

7973L

[quote]>> mem.free/1024/1024 #获取内存空闲数[/quote]

185L

[quote]>> psutil.swap_memory() #获取swap分区信息[/quote]

sswap(total=8587182080L, used=143360L, free=8587038720L, percent=0.0, sin=0, sout=143360)3.磁盘信息
    在系统磁盘信息中我们比较关注的是磁盘的利用率和IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些IO信息可以使用psutil.disk_io_counters()获取。>>> psutil.disk_partitions() #使用psutil.disk_partions()获取磁盘完整信息

[sdiskpart(device=’/dev/sda2′, mountpoint=’/’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda5′, mountpoint=’/data’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda1′, mountpoint=’/boot’, fstype=’ext3′, opts=’rw’)]

[quote]>> psutil.disk_usage(‘/’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=52005134336, used=3963228160, free=45357588480, percent=7.5999999999999996)

[quote]>> psutil.disk_usage(‘/data’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=423282647040, used=32194187264, free=369240064000, percent=7.5999999999999996)

[quote]>> psutil.disk_io_counters() #使用psutil.disk_io_counters获取硬盘总的IO个数读写信息[/quote]

sdiskio(read_count=95397, write_count=3333898, read_bytes=1524504064, write_bytes=90824263168, read_time=256049, write_time=20039375)

[quote]>> psutil.disk_io_counters(perdisk=True) [size=16]”perdisk=True” 参数获取单个分区IO个数读写信息[/size][/quote]

{‘sda4′: sdiskio(read_count=5, write_count=0, read_bytes=5120, write_bytes=0, read_time=50, write_time=0), ‘sda5′: sdiskio(read_count=29679, write_count=1161203, read_bytes=594831360, write_bytes=46546737152, read_time=79547, write_time=12518375), ‘sda2′: sdiskio(read_count=65407, write_count=2172728, read_bytes=927507456, write_bytes=44279271424, read_time=175431, write_time=7521025), ‘sda3′: sdiskio(read_count=39, write_count=3, read_bytes=831488, write_bytes=143360, read_time=158, write_time=10), ‘sda1′: sdiskio(read_count=267, write_count=26, read_bytes=1328640, write_bytes=28160, read_time=863, write_time=32)}4.网络信息
    系统的网络信息和磁盘信息类似,涉及几个关键的点,包括bytes_sent(发送字节数)、bytes_recv(接受字节数)、packets_sent(发送数据包数)、packets_recv(接受数据包数)等。这些网络信息可以使用psutil.net_io_counters()方法获取。>>> psutil.net_io_counters() [size=16]使用psutil.net_io_counters获取到网络总的IO信息,默认pernic=False[/size]

snetio(bytes_sent=98373481869, bytes_recv=630483790117, packets_sent=869376956, packets_recv=894221315, errin=0, errout=0, dropin=0, dropout=0)

[quote]>> psutil.net_io_counters(pernic=True) [size=16]pernic=True,输出每个网络接口的IO信息[/size][/quote]

{‘lo': snetio(bytes_sent=1064059797, bytes_recv=1064059797, packets_sent=6473544, packets_recv=6473544, errin=0, errout=0, dropin=0, dropout=0), ‘sit0′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth3′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth2′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth1′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth0′: snetio(bytes_sent=97313244366, bytes_recv=629446229973, packets_sent=862937674, packets_recv=887781757, errin=0, errout=0, dropin=0, dropout=0)}5.其他一些系统信息
     除了前面介绍的几个获取系统的基本信息的方法,psutil模块还支持获取用户登录、开机时间信息>>> psutil.users() #使用psutil.users方法获取当前登陆用户的信息

[suser(name=’root’, terminal=’pts/0′, host=’111.206.162.94′, started=1417013248.0)]

[quote]>> psutil.boot_time() #使用psutil.boot_time方法获取开机时间,默认以linux时间戳返回[/quote]

1415455455.0

[quote]>> import datetime [size=16]#导入datetime模块,格式化时间戳,转换成自然时间格式[/size][/quote]

[quote]>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(“%Y-%M-%d %H:%M:%S”)[/quote]

‘2014-04-08 22:04:15′

系统进程管理方法

 
    获取当前系统的进程信息,可以让运维得知当前应用程序的运行状态,包括进程的启动时间,查看或设置CPU亲和度,内存使用率,IO信息,socket链接,线程数等。这些信息可以呈现出指定进程是否存活,资源利用情况,为开发人员的代码优化,问题定位提供了很好的数据参考。
 
 1.进程信息
    psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。>>> psutil.pids() #获取所有进程的PID

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 105, 116, 117, 118, 119 …… ]

[quote]>> p = psutil.Process(5926) #实例化一个Process对象,参数为一个进程PID[/quote]

[quote]>> p.name() #进程名[/quote]

‘httpd’

[quote]>> p.exe() #进程bin路径[/quote]

‘/usr/local/apache2/bin/httpd’

[quote]>> p.cwd() #进程工作绝对路径目录[/quote]

‘/data/www/crh/monitor’

[quote]>> p.status() #进程状态[/quote]

‘sleeping’

[quote]>> p.create_time() #进程创建时间,时间戳格式[/quote]

1417019136.6400001

[quote]>> p.uids() #进程uid信息[/quote]

puids(real=2, effective=2, saved=2)

[quote]>> p.gids() #进程gid信息[/quote]

pgids(real=2, effective=2, saved=2)

[quote]>> p.cpu_times() # 进程cpu时间信息[/quote]

pcputimes(user=0.68000000000000005, system=0.13)

[quote]>> p.memory_info() #进程内存利用率[/quote]

pmem(rss=9306112, vms=147357696)

[quote]>> p.io_counters() # 进程io信息,包括读写io数以及字节数[/quote]

pio(read_count=8390, write_count=1282, read_bytes=0, write_bytes=311296)

[quote]>> p.connections() #返回打开进程socket的namedutples列表[/quote]

[pconn(fd=3, family=10, type=1, laddr=(‘::’, 8001), raddr=(), status=’LISTEN’)]

[quote]>> p.num_threads() #进程开启线程数[/quote]

12.popen类的使用
    psutil提供的popen类的作用是获取用户启动应用程序的信息,以便跟踪程序进程的允许状态。>>> import psutil

[quote]>> from subprocess import PIPE[/quote]

[size=16]通过psutil的Popen方法启动应用程序,可以跟着应用程序的相关信息[/size]

[quote]>> p = psutil.Popen([“/usr/bin/python”, “-c”, “print (‘hello’)”], stdout=PIPE)[/quote]

[quote]>> p.name()[/quote]

‘python’

[quote]>> p.username()[/quote]

‘root’

[quote]>> p.communicate()[/quote]

(‘hello\n’, None)

[quote]>> p.cpu_times()[/quote]

pcputimes(user=0.02, system=0.060000000000000001) psutile更多方法参考:https://github.com/giampaolo/psutil

模块说明官网:http://pythonhosted.org/psutil/ 查看全部
py1.jpeg
   
     psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU 、内存、磁盘、网络等)信息,它主要应用于系统监控,分析和限制系统资源以及进程的管理。它可以实现等同于命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和SunSolaris等操作系统,支持从2.4到3.4的python版本,目前最新版本为2.0.0。
 
    通常我们获取操作系统信息往往采用编写shell脚本来实现,如获取当前系统的物理内存总大小和使用大小,shell命令如下:
物理内存total值: free -m |grep Mem |awk ‘{print $2}’
物理内存used值:free -m |grep Mem | awk ‘{print $3}’
    相比较而言,使用psutil库实现起来就更加简单了。psutil大小单位一般采用字节(Byte),如下:
>>> import psutil
[quote]>> mem = psutil.virtual_memory()
>>> mem.total,mem.used
(8361156608L, 8215703552L)
转换成M为单位的话可以如下:
>>> print mem.total/1024/1024,mem.used/1024/1024
7973 7835


psutil的安装


    centos下:
[root@crh]#yum search python |grep psutil
python26-psutil.x86_64 : A process and system utilities module for Python
所以我只需要yum -y install python26-psutil 就可以了
    源码安装:
[root@crh]#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz
[root@crh]#tar zxf psutil-2.0.0.tar.gz
[root@crh]#cd psutil-2.0.0
[root@crh]#python setup.py install
安装完成后,进入到python交互模式你可以导入试试。。。。


获取系统性能信息


    采集系统的基本性能信息包括(cpu、内存、磁盘、网络等,可以完整描述当前系统的运行的状态以及质量。psutil模块已经封装好了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用,那我们就开始来学习吧。走起。。。。。
 
1.CPU信息
    Linux操作系统的CPU利用率主要有以下几个部分:
    []User Time, 执行用户进程的时间百分比;[/][]System Time,执行内核进程和中断的时间百分比;[/][]Wait IO, 由于IO等待而让CPU处于idle(空闲)状态的时间百分比;[/][]Idle, CPU处于idle状态的时间百分比。[/]

    我们使用Python的psutil.cpu_times()方法可以非常简单的获取到这些信息,同时也可以获取到CPU的硬件相关的信息,比如CPU的物理个数和逻辑个数,具体看下面的操作例子:
>>> import psutil
>>> psutil.cpu_times() [size=16]使用cpu_items方法获取CPU完整信息[/size]
cputimes(user=202656.94, nice=0.85999999999999999, system=83652.119999999995, idle=10823517.810000001, iowait=1242.27, irq=632.41999999999996, softirq=8720.3500000000004)[/quote]

[quote]>> psutil.cpu_times(percpu=True) #[size=16]#显示所有逻辑CPU的信息,指定percpu=True就好[/size]
[cputimes(user=8798.4200000000001, nice=0.029999999999999999, system=4920.2399999999998, idle=1376294.9399999999, iowait=40.539999999999999, irq=0.01, softirq=24.239999999999998), cputimes(user=35990.419999999998, nice=0.20000000000000001, system=13513.059999999999, idle=1338291.54, iowait=431.29000000000002, irq=95.420000000000002, softirq=1756.3499999999999), cputimes(user=23382.98, nice=0.080000000000000002, system=9391.4300000000003, idle=1356101.8899999999, iowait=102.27, irq=48.829999999999998, softirq=1050.73), cputimes(user=36171.690000000002, nice=0.28999999999999998, system=13764.790000000001, idle=1337939.1399999999, iowait=383.88, irq=91.719999999999999, softirq=1726.6199999999999), cputimes(user=9241.1200000000008, nice=0.070000000000000007, system=5088.5100000000002, idle=1375672.72, iowait=36.68, irq=0.01, softirq=38.950000000000003), cputimes(user=35656.849999999999, nice=0.089999999999999997, system=13522.209999999999, idle=1339042.3700000001, iowait=114.27, irq=84.890000000000001, softirq=1657.29), cputimes(user=17315.099999999999, nice=0.0, system=9599.6100000000006, idle=1362112.8, iowait=28.25, irq=224.88999999999999, softirq=797.25999999999999), cputimes(user=36109.360000000001, nice=0.070000000000000007, system=13855.99, idle=1338251.4299999999, iowait=105.06999999999999, irq=86.640000000000001, softirq=1669.28)][/quote]

[quote]>> psutil.cpu_times().user [size=16]# 获取CPU的但单项数据,如用户的CPU时间比[/size]
202673.82000000001[/quote]

[quote]>> psutil.cpu_count() [size=16]#获取cpu逻辑个数,默认logical=True ****注释如果你的psutil的版本不对的话可能没有cpu_count这个方法[/size][/quote]

8

[quote]>> psutil.cpu_count(logical=False) [size=16]#获取cpu的物理个数[/size][/quote]

1
2.内存信息
    Linux 系统的内存信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取到这些信息。
>>> mem = psutil.virtual_memory()  #使用psutil.virtual_memory方法获取内存完整信息

[quote]>> mem[/quote]

svmem(total=8361156608L, available=5626871808L, percent=32.700000000000003, used=8166158336L, free=194998272L, active=2812674048, inactive=4402806784, buffers=290136064L, cached=5141737472)

[quote]>>[/quote]

[quote]>> mem.total/1024/1024 #获取内存总数[/quote]

7973L

[quote]>> mem.free/1024/1024 #获取内存空闲数[/quote]

185L

[quote]>> psutil.swap_memory() #获取swap分区信息[/quote]

sswap(total=8587182080L, used=143360L, free=8587038720L, percent=0.0, sin=0, sout=143360)
3.磁盘信息
    在系统磁盘信息中我们比较关注的是磁盘的利用率和IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些IO信息可以使用psutil.disk_io_counters()获取。
>>> psutil.disk_partitions()        #使用psutil.disk_partions()获取磁盘完整信息

[sdiskpart(device=’/dev/sda2′, mountpoint=’/’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda5′, mountpoint=’/data’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda1′, mountpoint=’/boot’, fstype=’ext3′, opts=’rw’)]

[quote]>> psutil.disk_usage(‘/’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=52005134336, used=3963228160, free=45357588480, percent=7.5999999999999996)

[quote]>> psutil.disk_usage(‘/data’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=423282647040, used=32194187264, free=369240064000, percent=7.5999999999999996)

[quote]>> psutil.disk_io_counters() #使用psutil.disk_io_counters获取硬盘总的IO个数读写信息[/quote]

sdiskio(read_count=95397, write_count=3333898, read_bytes=1524504064, write_bytes=90824263168, read_time=256049, write_time=20039375)

[quote]>> psutil.disk_io_counters(perdisk=True) [size=16]”perdisk=True” 参数获取单个分区IO个数读写信息[/size][/quote]

{‘sda4′: sdiskio(read_count=5, write_count=0, read_bytes=5120, write_bytes=0, read_time=50, write_time=0), ‘sda5′: sdiskio(read_count=29679, write_count=1161203, read_bytes=594831360, write_bytes=46546737152, read_time=79547, write_time=12518375), ‘sda2′: sdiskio(read_count=65407, write_count=2172728, read_bytes=927507456, write_bytes=44279271424, read_time=175431, write_time=7521025), ‘sda3′: sdiskio(read_count=39, write_count=3, read_bytes=831488, write_bytes=143360, read_time=158, write_time=10), ‘sda1′: sdiskio(read_count=267, write_count=26, read_bytes=1328640, write_bytes=28160, read_time=863, write_time=32)}
4.网络信息
    系统的网络信息和磁盘信息类似,涉及几个关键的点,包括bytes_sent(发送字节数)、bytes_recv(接受字节数)、packets_sent(发送数据包数)、packets_recv(接受数据包数)等。这些网络信息可以使用psutil.net_io_counters()方法获取。
>>> psutil.net_io_counters()     [size=16]使用psutil.net_io_counters获取到网络总的IO信息,默认pernic=False[/size]

snetio(bytes_sent=98373481869, bytes_recv=630483790117, packets_sent=869376956, packets_recv=894221315, errin=0, errout=0, dropin=0, dropout=0)

[quote]>> psutil.net_io_counters(pernic=True) [size=16]pernic=True,输出每个网络接口的IO信息[/size][/quote]

{‘lo': snetio(bytes_sent=1064059797, bytes_recv=1064059797, packets_sent=6473544, packets_recv=6473544, errin=0, errout=0, dropin=0, dropout=0), ‘sit0′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth3′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth2′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth1′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth0′: snetio(bytes_sent=97313244366, bytes_recv=629446229973, packets_sent=862937674, packets_recv=887781757, errin=0, errout=0, dropin=0, dropout=0)}
5.其他一些系统信息
     除了前面介绍的几个获取系统的基本信息的方法,psutil模块还支持获取用户登录、开机时间信息
>>> psutil.users()    #使用psutil.users方法获取当前登陆用户的信息

[suser(name=’root’, terminal=’pts/0′, host=’111.206.162.94′, started=1417013248.0)]

[quote]>> psutil.boot_time() #使用psutil.boot_time方法获取开机时间,默认以linux时间戳返回[/quote]

1415455455.0

[quote]>> import datetime [size=16]#导入datetime模块,格式化时间戳,转换成自然时间格式[/size][/quote]

[quote]>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(“%Y-%M-%d %H:%M:%S”)[/quote]

‘2014-04-08 22:04:15′


系统进程管理方法


 
    获取当前系统的进程信息,可以让运维得知当前应用程序的运行状态,包括进程的启动时间,查看或设置CPU亲和度,内存使用率,IO信息,socket链接,线程数等。这些信息可以呈现出指定进程是否存活,资源利用情况,为开发人员的代码优化,问题定位提供了很好的数据参考。
 
 1.进程信息
    psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。
>>> psutil.pids()  #获取所有进程的PID

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 105, 116, 117, 118, 119 …… ]

[quote]>> p = psutil.Process(5926) #实例化一个Process对象,参数为一个进程PID[/quote]

[quote]>> p.name() #进程名[/quote]

‘httpd’

[quote]>> p.exe() #进程bin路径[/quote]

‘/usr/local/apache2/bin/httpd’

[quote]>> p.cwd() #进程工作绝对路径目录[/quote]

‘/data/www/crh/monitor’

[quote]>> p.status() #进程状态[/quote]

‘sleeping’

[quote]>> p.create_time() #进程创建时间,时间戳格式[/quote]

1417019136.6400001

[quote]>> p.uids() #进程uid信息[/quote]

puids(real=2, effective=2, saved=2)

[quote]>> p.gids() #进程gid信息[/quote]

pgids(real=2, effective=2, saved=2)

[quote]>> p.cpu_times() # 进程cpu时间信息[/quote]

pcputimes(user=0.68000000000000005, system=0.13)

[quote]>> p.memory_info() #进程内存利用率[/quote]

pmem(rss=9306112, vms=147357696)

[quote]>> p.io_counters() # 进程io信息,包括读写io数以及字节数[/quote]

pio(read_count=8390, write_count=1282, read_bytes=0, write_bytes=311296)

[quote]>> p.connections() #返回打开进程socket的namedutples列表[/quote]

[pconn(fd=3, family=10, type=1, laddr=(‘::’, 8001), raddr=(), status=’LISTEN’)]

[quote]>> p.num_threads() #进程开启线程数[/quote]

1
2.popen类的使用
    psutil提供的popen类的作用是获取用户启动应用程序的信息,以便跟踪程序进程的允许状态。
>>> import psutil

[quote]>> from subprocess import PIPE[/quote]

[size=16]通过psutil的Popen方法启动应用程序,可以跟着应用程序的相关信息[/size]

[quote]>> p = psutil.Popen([“/usr/bin/python”, “-c”, “print (‘hello’)”], stdout=PIPE)[/quote]

[quote]>> p.name()[/quote]

‘python’

[quote]>> p.username()[/quote]

‘root’

[quote]>> p.communicate()[/quote]

(‘hello\n’, None)

[quote]>> p.cpu_times()[/quote]

pcputimes(user=0.02, system=0.060000000000000001)
 psutile更多方法参考:
https://github.com/giampaolo/psutil

模块说明官网:http://pythonhosted.org/psutil/


Python 面向对象其实很简单 (初级篇)

OpenSkill 发表了文章 • 0 个评论 • 783 次浏览 • 2015-09-05 18:23 • 来自相关话题

概述

[]面向过程:根据业务逻辑从上到下写垒代码[/][]函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可[/][]面向对象:对函数进行分类和封装,让开发“更快更好更强...”[/]
 
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。while True:
if cpu利用率 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

if 硬盘使用空间 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

if 内存占用 > 80%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接随着时间的推移,开始使用了函数式编程,增强代码的重用性和可读性,就变成了这样:def 发送邮件(内容)
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

while True:

if cpu利用率 > 90%:
发送邮件('CPU报警')

if 硬盘使用空间 > 90%:
发送邮件('硬盘报警')

if 内存占用 > 80%:
发送邮件('内存报警') 今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程

创建类和对象

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
        类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
        对象则是根据模板创建的实例,通过实例对象可以执行类中的函数





[]class是关键字,表示类[/][]创建对象,类名称后加括号即可[/]
 
ps:类中的函数第一个参数必须是self(详细见:类的三大特性之封装)
类中定义的函数叫做 “方法”# 创建类
class Foo:

def Bar(self):
print 'Bar'

def Hello(self, name):
print 'i am %s' %name

# 根据类Foo创建对象obj
obj = Foo()
obj.Bar() #执行Bar方法
obj.Hello('wupeiqi') #执行Hello方法诶,你在这里是不是有疑问了?使用函数式编程和面向对象编程方式来执行一个“方法”时函数要比面向对象简便

面向对象:【创建对象】【通过对象执行方法】
函数编程:【执行函数】

观察上述对比答案则是肯定的,然后并非绝对,场景的不同适合其的编程方式也不同。

总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据

面向对象三大特性

面向对象的三大特性是指:封装、继承和多态。

一、封装


封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

将内容封装到某处
从某处调用被封装的内容

第一步:将内容封装到某处




self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

                                     当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。




第二步:从某处调用被封装的内容
调用被封装的内容时,有两种情况:
[]通过对象直接调用[/][]通过self间接调用[/]
1、通过对象直接调用被封装的内容

上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名class Foo:

def __init__(self, name, age):
self.name = name
self.age = age

obj1 = Foo('wupeiqi', 18)
print obj1.name # 直接调用obj1对象的name属性
print obj1.age # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)
print obj2.name # 直接调用obj2对象的name属性
print obj2.age # 直接调用obj2对象的age属性2、通过self间接调用被封装的内容

执行类中的方法时,需要通过self间接调用被封装的内容class Foo:

def __init__(self, name, age):
self.name = name
self.age = age

def detail(self):
print self.name
print self.age

obj1 = Foo('wupeiqi', 18)
obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18

obj2 = Foo('alex', 73)
obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
 
练习一:在终端输出如下信息
[]小明,10岁,男,上山去砍柴[/][]小明,10岁,男,开车去东北[/][]小明,10岁,男,最爱大保健[/][] [/][]老李,90岁,男,上山去砍柴[/][]老李,90岁,男,开车去东北[/][]老李,90岁,男,最爱大保健[/][] [/][]老张...[/]
def kanchai(name, age, gender):
print "%s,%s岁,%s,上山去砍柴" %(name, age, gender)


def qudongbei(name, age, gender):
print "%s,%s岁,%s,开车去东北" %(name, age, gender)


def dabaojian(name, age, gender):
print "%s,%s岁,%s,最爱大保健" %(name, age, gender)


kanchai('小明', 10, '男')
qudongbei('小明', 10, '男')
dabaojian('小明', 10, '男')


kanchai('老李', 90, '男')
qudongbei('老李', 90, '男')
dabaojian('老李', 90, '男')class Foo:

def __init__(self, name, age ,gender):
self.name = name
self.age = age
self.gender = gender

def kanchai(self):
print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)

def qudongbei(self):
print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)

def dabaojian(self):
print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)


xiaoming = Foo('小明', 10, '男')
xiaoming.kanchai()
xiaoming.qudongbei()
xiaoming.dabaojian()

laoli = Foo('老李', 90, '男')
laoli.kanchai()
laoli.qudongbei()
laoli.dabaojian()

面向对象上述对比可以看出,如果使用函数式编程,需要在每次执行函数时传入相同的参数,如果参数多的话,又需要粘贴复制了... ;而对于面向对象只需要在创建对象时,将所有需要的参数封装到当前对象中,之后再次使用时,通过self间接去当前对象中取值即可。练习二:游戏人生程序
1、创建三个游戏人物,分别是:
[]苍井井,女,18,初始战斗力1000[/][]东尼木木,男,20,初始战斗力1800[/][]波多多,女,19,初始战斗力2500[/]

2、游戏场景,分别:
[]草丛战斗,消耗200战斗力[/][]自我修炼,增长100战斗力[/][]多人游戏,消耗500战斗力[/]
# -[i]- coding:utf-8 -[/i]-

# ##################[size=16]# 定义实现功能的类 [/size]################[size=16]#[/size]

class Person:

def __init__(self, na, gen, age, fig):
self.name = na
self.gender = gen
self.age = age
self.fight =fig

def grassland(self):
"""注释:草丛战斗,消耗200战斗力"""

self.fight = self.fight - 200

def practice(self):
"""注释:自我修炼,增长100战斗力"""

self.fight = self.fight + 200

def incest(self):
"""注释:多人游戏,消耗500战斗力"""

self.fight = self.fight - 500

def detail(self):
"""注释:当前对象的详细情况"""

temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight)
print temp


# ##################[size=16]# 开始游戏 [/size]################[size=16]#[/size]

cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
bo = Person('波多多', '女', 19, 2500) # 创建波多多角色

cang.incest() #苍井空参加一次多人游戏
dong.practice()#东尼木木自我修炼了一次
bo.grassland() #波多多参加一次草丛战斗


#输出当前所有人的详细情况
cang.detail()
dong.detail()
bo.detail()


cang.incest() #苍井空又参加一次多人游戏
dong.incest() #东尼木木也参加了一个多人游戏
bo.practice() #波多多自我修炼了一次

#输出当前所有人的详细情况
cang.detail()
dong.detail()
bo.detail()

游戏人生

二、继承

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

例如:

猫可以:喵喵叫、吃、喝、拉、撒

狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,如下所示:伪代码

class 猫:

def 喵喵叫(self):
print '喵喵叫'

def 吃(self):
# do something

def 喝(self):
# do something

def 拉(self):
# do something

def 撒(self):
# do something

class 狗:

def 汪汪叫(self):
print '喵喵叫'

def 吃(self):
# do something

def 喝(self):
# do something

def 拉(self):
# do something

def 撒(self):
# do something上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:

  动物:吃、喝、拉、撒

  猫:喵喵叫(猫继承动物的功能)

  狗:汪汪叫(狗继承动物的功能)伪代码

class 动物:

def 吃(self):
# do something

def 喝(self):
# do something

def 拉(self):
# do something

def 撒(self):
# do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

def 喵喵叫(self):
print '喵喵叫'

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

def 汪汪叫(self):
print '喵喵叫'代码实例

class Animal:

def eat(self):
print "%s 吃 " %self.name

def drink(self):
print "%s 喝 " %self.name

def shit(self):
print "%s 拉 " %self.name

def pee(self):
print "%s 撒 " %self.name


class Cat(Animal):

def __init__(self, name):
self.name = name
self.breed = '猫'

def cry(self):
print '喵喵叫'

class Dog(Animal):

def __init__(self, name):
self.name = name
self.breed = '狗'

def cry(self):
print '汪汪叫'


# ######[size=16]# 执行 [/size]####[size=16]#[/size]

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。




学习了继承的写法之后,我们用代码来是上述阿猫阿狗的功能:代码实例

class Animal:

def eat(self):
print "%s 吃 " %self.name

def drink(self):
print "%s 喝 " %self.name

def shit(self):
print "%s 拉 " %self.name

def pee(self):
print "%s 撒 " %self.name


class Cat(Animal):

def __init__(self, name):
self.name = name
self.breed = '猫'

def cry(self):
print '喵喵叫'

class Dog(Animal):

def __init__(self, name):
self.name = name
self.breed = '狗'

def cry(self):
print '汪汪叫'


# ######[size=16]# 执行 [/size]####[size=16]#[/size]

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()那么问题又来了,多继承呢?

是否可以继承多个类

如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先




[]当类是经典类时,多继承情况下,会按照深度优先方式查找[/][]当类是新式类时,多继承情况下,会按照广度优先方式查找[/]
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。



经典类多继承

class D:

def bar(self):
print 'D.bar'


class C(D):

def bar(self):
print 'C.bar'


class B(D):

def bar(self):
print 'B.bar'


class A(B, C):

def bar(self):
print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()新式类多继承

class D(object):

def bar(self):
print 'D.bar'


class C(D):

def bar(self):
print 'C.bar'


class B(D):

def bar(self):
print 'B.bar'


class A(B, C):

def bar(self):
print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

三、多态

 Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。Python伪代码实现Java或C#的多态

class F1:
pass


class S1(F1):

def show(self):
print 'S1.show'


class S2(F1):

def show(self):
print 'S2.show'


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型"""

print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.showPython “鸭子类型”

class F1:
pass


class S1(F1):

def show(self):
print 'S1.show'


class S2(F1):

def show(self):
print 'S2.show'

def Func(obj):
print obj.show()

s1_obj = S1()
Func(s1_obj)

s2_obj = S2()
Func(s2_obj)

总结 

以上就是本节对于面向对象初级知识的介绍,总结如下:
[]面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用[/][]类 是一个模板,模板中包装了多个“函数”供使用[/][]对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数[/][]面向对象三大特性:封装、继承和多态[/]
问答专区

问题一:什么样的代码才是面向对象?

答:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了。

问题二:函数式编程 和 面向对象 如何选择?分别在什么情况下使用?

答:须知:对于 C# 和 Java 程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。

所以,一般在Python开发中,全部使用面向对象 或 面向对象和函数式混合使用

面向对象的应用场景:

     1.多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码class SqlHelper:

def __init__(self, host, user, pwd):

self.host = host
self.user = user
self.pwd = pwd

def 增(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接

def 删(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接

def 改(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接

def 查(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接# do something

Demo     2.需要创建多个事物,每个事物属性个数相同,但是值的需求
     如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同class Person:

def __init__(self, name ,age ,blood_type):

self.name = name
self.age = age
self.blood_type = blood_type


def detail(self):
temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type)
print temp

zhangsan = Person('张三', 18, 'A')
lisi = Person('李四', 73, 'AB')
yangwu = Person('杨五', 84, 'A')

Demo问题三:类和对象在内存中是如何保存?
答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:




如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。

当通过 obj1 执行 【方法一】 时,过程如下:

根据当前对象中的 类对象指针 找到类中的方法
将对象 obj1 当作参数传给 方法的第一个参数 self 
原文地址:武沛齐 查看全部
ipython.png


概述


    []面向过程:根据业务逻辑从上到下写垒代码[/][]函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可[/][]面向对象:对函数进行分类和封装,让开发“更快更好更强...”[/]

 
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。
while True:
if cpu利用率 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

if 硬盘使用空间 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

if 内存占用 > 80%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接
随着时间的推移,开始使用了函数式编程,增强代码的重用性和可读性,就变成了这样:
def 发送邮件(内容)
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

while True:

if cpu利用率 > 90%:
发送邮件('CPU报警')

if 硬盘使用空间 > 90%:
发送邮件('硬盘报警')

if 内存占用 > 80%:
发送邮件('内存报警')
今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程


创建类和对象


面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
        类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
        对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

pl1.jpg

    []class是关键字,表示类[/][]创建对象,类名称后加括号即可[/]

 
ps:类中的函数第一个参数必须是self(详细见:类的三大特性之封装)
类中定义的函数叫做 “方法”
# 创建类
class Foo:

def Bar(self):
print 'Bar'

def Hello(self, name):
print 'i am %s' %name

# 根据类Foo创建对象obj
obj = Foo()
obj.Bar() #执行Bar方法
obj.Hello('wupeiqi') #执行Hello方法
诶,你在这里是不是有疑问了?使用函数式编程和面向对象编程方式来执行一个“方法”时函数要比面向对象简便

面向对象:【创建对象】【通过对象执行方法】
函数编程:【执行函数】

观察上述对比答案则是肯定的,然后并非绝对,场景的不同适合其的编程方式也不同。

总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据


面向对象三大特性


面向对象的三大特性是指:封装、继承和多态。


一、封装



封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

将内容封装到某处
从某处调用被封装的内容

第一步:将内容封装到某处
pl2.jpg

self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

                                     当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。
pl3.jpg

第二步:从某处调用被封装的内容
调用被封装的内容时,有两种情况:
    []通过对象直接调用[/][]通过self间接调用[/]

1、通过对象直接调用被封装的内容

上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名
class Foo:

def __init__(self, name, age):
self.name = name
self.age = age

obj1 = Foo('wupeiqi', 18)
print obj1.name # 直接调用obj1对象的name属性
print obj1.age # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)
print obj2.name # 直接调用obj2对象的name属性
print obj2.age # 直接调用obj2对象的age属性
2、通过self间接调用被封装的内容

执行类中的方法时,需要通过self间接调用被封装的内容
class Foo:

def __init__(self, name, age):
self.name = name
self.age = age

def detail(self):
print self.name
print self.age

obj1 = Foo('wupeiqi', 18)
obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18

obj2 = Foo('alex', 73)
obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78
综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
 
练习一:在终端输出如下信息
    []小明,10岁,男,上山去砍柴[/][]小明,10岁,男,开车去东北[/][]小明,10岁,男,最爱大保健[/][] [/][]老李,90岁,男,上山去砍柴[/][]老李,90岁,男,开车去东北[/][]老李,90岁,男,最爱大保健[/][] [/][]老张...[/]

def kanchai(name, age, gender):
print "%s,%s岁,%s,上山去砍柴" %(name, age, gender)


def qudongbei(name, age, gender):
print "%s,%s岁,%s,开车去东北" %(name, age, gender)


def dabaojian(name, age, gender):
print "%s,%s岁,%s,最爱大保健" %(name, age, gender)


kanchai('小明', 10, '男')
qudongbei('小明', 10, '男')
dabaojian('小明', 10, '男')


kanchai('老李', 90, '男')
qudongbei('老李', 90, '男')
dabaojian('老李', 90, '男')
class Foo:

def __init__(self, name, age ,gender):
self.name = name
self.age = age
self.gender = gender

def kanchai(self):
print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)

def qudongbei(self):
print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)

def dabaojian(self):
print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)


xiaoming = Foo('小明', 10, '男')
xiaoming.kanchai()
xiaoming.qudongbei()
xiaoming.dabaojian()

laoli = Foo('老李', 90, '男')
laoli.kanchai()
laoli.qudongbei()
laoli.dabaojian()

面向对象
上述对比可以看出,如果使用函数式编程,需要在每次执行函数时传入相同的参数,如果参数多的话,又需要粘贴复制了...  ;而对于面向对象只需要在创建对象时,将所有需要的参数封装到当前对象中,之后再次使用时,通过self间接去当前对象中取值即可。
练习二:游戏人生程序
1、创建三个游戏人物,分别是:
    []苍井井,女,18,初始战斗力1000[/][]东尼木木,男,20,初始战斗力1800[/][]波多多,女,19,初始战斗力2500[/]


2、游戏场景,分别:
    []草丛战斗,消耗200战斗力[/][]自我修炼,增长100战斗力[/][]多人游戏,消耗500战斗力[/]

# -[i]- coding:utf-8 -[/i]-

# ##################[size=16]# 定义实现功能的类 [/size]################[size=16]#[/size]

class Person:

def __init__(self, na, gen, age, fig):
self.name = na
self.gender = gen
self.age = age
self.fight =fig

def grassland(self):
"""注释:草丛战斗,消耗200战斗力"""

self.fight = self.fight - 200

def practice(self):
"""注释:自我修炼,增长100战斗力"""

self.fight = self.fight + 200

def incest(self):
"""注释:多人游戏,消耗500战斗力"""

self.fight = self.fight - 500

def detail(self):
"""注释:当前对象的详细情况"""

temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight)
print temp


# ##################[size=16]# 开始游戏 [/size]################[size=16]#[/size]

cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
bo = Person('波多多', '女', 19, 2500) # 创建波多多角色

cang.incest() #苍井空参加一次多人游戏
dong.practice()#东尼木木自我修炼了一次
bo.grassland() #波多多参加一次草丛战斗


#输出当前所有人的详细情况
cang.detail()
dong.detail()
bo.detail()


cang.incest() #苍井空又参加一次多人游戏
dong.incest() #东尼木木也参加了一个多人游戏
bo.practice() #波多多自我修炼了一次

#输出当前所有人的详细情况
cang.detail()
dong.detail()
bo.detail()

游戏人生


二、继承


继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

例如:

猫可以:喵喵叫、吃、喝、拉、撒

狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,如下所示:
伪代码

class 猫:

def 喵喵叫(self):
print '喵喵叫'

def 吃(self):
# do something

def 喝(self):
# do something

def 拉(self):
# do something

def 撒(self):
# do something

class 狗:

def 汪汪叫(self):
print '喵喵叫'

def 吃(self):
# do something

def 喝(self):
# do something

def 拉(self):
# do something

def 撒(self):
# do something
上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:

  动物:吃、喝、拉、撒

  猫:喵喵叫(猫继承动物的功能)

  狗:汪汪叫(狗继承动物的功能)
伪代码

class 动物:

def 吃(self):
# do something

def 喝(self):
# do something

def 拉(self):
# do something

def 撒(self):
# do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

def 喵喵叫(self):
print '喵喵叫'

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

def 汪汪叫(self):
print '喵喵叫'
代码实例

class Animal:

def eat(self):
print "%s 吃 " %self.name

def drink(self):
print "%s 喝 " %self.name

def shit(self):
print "%s 拉 " %self.name

def pee(self):
print "%s 撒 " %self.name


class Cat(Animal):

def __init__(self, name):
self.name = name
self.breed = '猫'

def cry(self):
print '喵喵叫'

class Dog(Animal):

def __init__(self, name):
self.name = name
self.breed = '狗'

def cry(self):
print '汪汪叫'


# ######[size=16]# 执行 [/size]####[size=16]#[/size]

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()
所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
pl4.jpg

学习了继承的写法之后,我们用代码来是上述阿猫阿狗的功能:
代码实例

class Animal:

def eat(self):
print "%s 吃 " %self.name

def drink(self):
print "%s 喝 " %self.name

def shit(self):
print "%s 拉 " %self.name

def pee(self):
print "%s 撒 " %self.name


class Cat(Animal):

def __init__(self, name):
self.name = name
self.breed = '猫'

def cry(self):
print '喵喵叫'

class Dog(Animal):

def __init__(self, name):
self.name = name
self.breed = '狗'

def cry(self):
print '汪汪叫'


# ######[size=16]# 执行 [/size]####[size=16]#[/size]

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()
那么问题又来了,多继承呢?

是否可以继承多个类

如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
pl5.jpg

    []当类是经典类时,多继承情况下,会按照深度优先方式查找[/][]当类是新式类时,多继承情况下,会按照广度优先方式查找[/]

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
pl6.jpg
经典类多继承

class D:

def bar(self):
print 'D.bar'


class C(D):

def bar(self):
print 'C.bar'


class B(D):

def bar(self):
print 'B.bar'


class A(B, C):

def bar(self):
print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
新式类多继承

class D(object):

def bar(self):
print 'D.bar'


class C(D):

def bar(self):
print 'C.bar'


class B(D):

def bar(self):
print 'B.bar'


class A(B, C):

def bar(self):
print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了


三、多态


 Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
Python伪代码实现Java或C#的多态

class F1:
pass


class S1(F1):

def show(self):
print 'S1.show'


class S2(F1):

def show(self):
print 'S2.show'


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型"""

print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show
Python “鸭子类型”

class F1:
pass


class S1(F1):

def show(self):
print 'S1.show'


class S2(F1):

def show(self):
print 'S2.show'

def Func(obj):
print obj.show()

s1_obj = S1()
Func(s1_obj)

s2_obj = S2()
Func(s2_obj)


总结 


以上就是本节对于面向对象初级知识的介绍,总结如下:
    []面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用[/][]类 是一个模板,模板中包装了多个“函数”供使用[/][]对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数[/][]面向对象三大特性:封装、继承和多态[/]

问答专区

问题一:什么样的代码才是面向对象?

答:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了。

问题二:函数式编程 和 面向对象 如何选择?分别在什么情况下使用?

答:须知:对于 C# 和 Java 程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。

所以,一般在Python开发中,全部使用面向对象 或 面向对象和函数式混合使用

面向对象的应用场景:

     1.多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码
class SqlHelper:

def __init__(self, host, user, pwd):

self.host = host
self.user = user
self.pwd = pwd

def 增(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接

def 删(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接

def 改(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接

def 查(self):
# 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
# do something
# 关闭数据库连接# do something

Demo
     2.需要创建多个事物,每个事物属性个数相同,但是值的需求
     如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同
class Person:

def __init__(self, name ,age ,blood_type):

self.name = name
self.age = age
self.blood_type = blood_type


def detail(self):
temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type)
print temp

zhangsan = Person('张三', 18, 'A')
lisi = Person('李四', 73, 'AB')
yangwu = Person('杨五', 84, 'A')

Demo
问题三:类和对象在内存中是如何保存?
答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:
pl7.jpg

如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。

当通过 obj1 执行 【方法一】 时,过程如下:

根据当前对象中的 类对象指针 找到类中的方法
将对象 obj1 当作参数传给 方法的第一个参数 self 
原文地址:武沛齐

PHP Fatal error: Class 'PDO' not found

OpenSkill 回复了问题 • 2 人关注 • 2 个回复 • 1897 次浏览 • 2015-08-28 17:26 • 来自相关话题

Python异常处理的三种常用方法

koyo 发表了文章 • 0 个评论 • 676 次浏览 • 2015-08-25 20:47 • 来自相关话题

如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序:try:
语句1
语句2
.
.
语句N
except .........:
do something .......但是你并不知道"语句1至语句N"在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,那么"except ......"这句应怎样写?
总结了一下3个方法:

方法一:捕获所有异常

try:
a=b
b=c
except Exception,e:
print Exception,":",e



方法二:采用traceback模块查看异常

#引入python中的traceback模块,跟踪错误
import traceback
try:
a=b
b=c
except:
traceback.print_exc()

方法三:采用sys模块回溯最后的异常

#引入sys模块
import sys
try:
a=b
b=c
except:
info=sys.exc_info()
print info[0],":",info[1]但是,如果你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:
把traceback.print_exc() 打印在屏幕上的信息保存到一个文本文件中import traceback
try:
a=b
b=c
except:
f=open("c:log.txt",'a')
traceback.print_exc(file=f)
f.flush()
f.close() 查看全部
如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序:
try:
语句1
语句2
.
.
语句N
except .........:
do something .......
但是你并不知道"语句1至语句N"在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,那么"except ......"这句应怎样写?
总结了一下3个方法:


方法一:捕获所有异常


try:  
a=b
b=c
except Exception,e:
print Exception,":",e



方法二:采用traceback模块查看异常


#引入python中的traceback模块,跟踪错误
import traceback
try:
a=b
b=c
except:
traceback.print_exc()


方法三:采用sys模块回溯最后的异常


#引入sys模块
import sys
try:
a=b
b=c
except:
info=sys.exc_info()
print info[0],":",info[1]
但是,如果你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:
把traceback.print_exc() 打印在屏幕上的信息保存到一个文本文件中
import traceback
try:
a=b
b=c
except:
f=open("c:log.txt",'a')
traceback.print_exc(file=f)
f.flush()
f.close()

AttributeError: 'module' object has no attribute 'error'

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 2206 次浏览 • 2015-08-23 08:24 • 来自相关话题

fabric执行命令出错

OpenSkill 发表了文章 • 0 个评论 • 922 次浏览 • 2015-07-31 16:42 • 来自相关话题

安装:
# pip install fabricfabric安装上了,但是在执行命令的时候出错:
Traceback (most recent call last):
File "bb.py", line 2, in <module>
from fabric.api import *
File "/usr/lib64/python2.6/site-packages/fabric/api.py", line 9, in <module>
from fabric.context_managers import (cd, hide, settings, show, path, prefix,
File "/usr/lib64/python2.6/site-packages/fabric/context_managers.py", line 41, in <module>
from fabric.state import output, win32, connections, env
File "/usr/lib64/python2.6/site-packages/fabric/state.py", line 9, in <module>
from fabric.network import HostConnectionCache, ssh
File "/usr/lib64/python2.6/site-packages/fabric/network.py", line 24, in <module>
import paramiko as ssh
File "/usr/lib/python2.6/site-packages/paramiko/__init__.py", line 30, in <module>
from paramiko.transport import SecurityOptions, Transport
File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 49, in <module>
from paramiko.dsskey import DSSKey
File "/usr/lib/python2.6/site-packages/paramiko/dsskey.py", line 26, in <module>
from Crypto.PublicKey import DSA
File "/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.py", line 88, in <module>
from Crypto.PublicKey import _DSA, _slowmath, pubkey
File "/usr/lib64/python2.6/site-packages/Crypto/PublicKey/_DSA.py", line 30, in <module>
from Crypto.PublicKey.pubkey import *
File "/usr/lib64/python2.6/site-packages/Crypto/PublicKey/pubkey.py", line 30, in <module>
from Crypto.Util.number import *
File "/usr/lib64/python2.6/site-packages/Crypto/Util/number.py", line 56, in <module>
if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
AttributeError: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'利用google搜索了一下,原因是缺少PyCrypto模块的错误:https://www.dlitz.net/software/pycrypto/ 
安装:
# wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
# tar -zxvf pycrypto-2.6.tar.gz
# cd pycrypto-2.6/
# python setup.py build && python setup.py install如果安装了还是不行,你可以做如下操作:
# vim /usr/lib64/python2.6/site-packages/Crypto/Util/number.py
注释
#if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:

一般number.py 在你python版本库site-packages目录下 查看全部
安装:
# pip install fabric
fabric安装上了,但是在执行命令的时候出错:
Traceback (most recent call last):
File "bb.py", line 2, in <module>
from fabric.api import *
File "/usr/lib64/python2.6/site-packages/fabric/api.py", line 9, in <module>
from fabric.context_managers import (cd, hide, settings, show, path, prefix,
File "/usr/lib64/python2.6/site-packages/fabric/context_managers.py", line 41, in <module>
from fabric.state import output, win32, connections, env
File "/usr/lib64/python2.6/site-packages/fabric/state.py", line 9, in <module>
from fabric.network import HostConnectionCache, ssh
File "/usr/lib64/python2.6/site-packages/fabric/network.py", line 24, in <module>
import paramiko as ssh
File "/usr/lib/python2.6/site-packages/paramiko/__init__.py", line 30, in <module>
from paramiko.transport import SecurityOptions, Transport
File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 49, in <module>
from paramiko.dsskey import DSSKey
File "/usr/lib/python2.6/site-packages/paramiko/dsskey.py", line 26, in <module>
from Crypto.PublicKey import DSA
File "/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.py", line 88, in <module>
from Crypto.PublicKey import _DSA, _slowmath, pubkey
File "/usr/lib64/python2.6/site-packages/Crypto/PublicKey/_DSA.py", line 30, in <module>
from Crypto.PublicKey.pubkey import *
File "/usr/lib64/python2.6/site-packages/Crypto/PublicKey/pubkey.py", line 30, in <module>
from Crypto.Util.number import *
File "/usr/lib64/python2.6/site-packages/Crypto/Util/number.py", line 56, in <module>
if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
AttributeError: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
利用google搜索了一下,原因是缺少PyCrypto模块的错误:https://www.dlitz.net/software/pycrypto/ 
安装:
# wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
# tar -zxvf pycrypto-2.6.tar.gz
# cd pycrypto-2.6/
# python setup.py build && python setup.py install
如果安装了还是不行,你可以做如下操作:
# vim /usr/lib64/python2.6/site-packages/Crypto/Util/number.py
注释
#if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:

一般number.py 在你python版本库site-packages目录下

ajax&js点击按钮出现提交框

欺壹世 发表了文章 • 2 个评论 • 744 次浏览 • 2015-07-30 17:37 • 来自相关话题

直接贴代码了:ajax
$(function(){
$('#bbtn').click(function(){
$.ajax({
type:'post',
url:'#',
data:{},
success:function(callback){
$('#part4').empty();
var ele = "<div>"
ele = ele + "<textarea name='order_note' style='height:65px; width:730px;'>在此处填写备注信息...</textarea>";
ele = ele + "</div>";
$('#part4').append(ele);
}
})

})
})

js
<script type="text/javascript">

function sub(){$("#Show").html("啦啦啦啦")}
</script>
<a href="#" onclick="sub()">sub</a> 查看全部
直接贴代码了:
ajax
$(function(){
$('#bbtn').click(function(){
$.ajax({
type:'post',
url:'#',
data:{},
success:function(callback){
$('#part4').empty();
var ele = "<div>"
ele = ele + "<textarea name='order_note' style='height:65px; width:730px;'>在此处填写备注信息...</textarea>";
ele = ele + "</div>";
$('#part4').append(ele);
}
})

})
})

js
<script type="text/javascript">

function sub(){$("#Show").html("啦啦啦啦")}
</script>
<a href="#" onclick="sub()">sub</a>

[error] [client 127.0.0.1] Directory index forbidden by Options directive: /data/www/afb

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 1709 次浏览 • 2015-07-28 10:41 • 来自相关话题

Mcrypt PHP extension required

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 1097 次浏览 • 2015-07-28 10:40 • 来自相关话题