Python快速入门篇(五)

1.Python模块

>>可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块
>>模块在物理形式上表现为以.py结尾的代码文件
 ->一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件
 ->模块的文件名就是模块的名字加上扩展名.py
 ->每个模块都有自己的名称空间
>>Python允许"导入"其它模块以实现代码重用,从而也实现了将独立代码文件组织成更大的程序系统
 ->Python中,模块也是对象
 ->在一个模块的顶层定义的所有变量都是被导入时成为了被导入模块的属性

1.1模块的执行环境

>>模块是被导入的,但模块也可以导入和使用其它模块,这些模块可以用Python或其它编程语言写成
>>模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其它元素

1.2导入模块

>>在导入模块时只能使用模块名,而不能使用带.py后缀的模块文件
>>import语句
 ->.导入指定的整个模块,包括生成一个以模块名命名的名称空间
 ->.import module1[,module2[,...moduleN]]
  #.建议一个import语句只导入一个模块
 ->.import module as mmodule_alias
>>from-import语句
 ->.常用于只导入指定模块的部分属性至当前名称空间
 ->.from module import name1[,name2[,...nameN]]
>>import和from-import是赋值语句
 ->.import和from是可可执行语句,类似于def,因此,它们可以嵌套在if测试中,出现于def中等等
 ->.Python执行到这些语句时才会对其进行解析,这意味着,所有来自模块的属性仅在import语句执行后才能使用
>>import和from都是隐性赋值语句
 ->.import将整个模块对象赋值给一个变量名
 ->.from将一个或多个变量名赋值给导入次模块的模块中的同名对象
>>模块就是名称空间
 ->.模块的名称空间可以通过属性__dict__或dir(M)获取
  #.模块属性可通过点号(.)运算符获取,格式为M.attr
 ->.模块是一个独立的作用域(本地变量就是全局变量)

1.import的工作机制

>>import语句导入指定的模块时会执行三个步骤
 ->.找到模块文件
  #.在指定的路径下搜索模块文件
 ->.编译成字节码
  #.文件导入时就会编译,因此,顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件
 ->.执行模块的代码来创建其所定义的对象
  #.模块文件中的所有语句会依次执行,从头至尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性
>>注意:模块只在第一次导入时才会执行如上步骤;
 ->.后续的导入操作只不过是提取内存中已加载的模块对象
 ->.reload()可用于重新加载模块

2.模块搜索

>>Python解释器在import模块时必须先找到对应的模块文件
 ->.程序的主目录
 ->.PYTHONPATH目录(如果设置了此变量)
 ->.标准链接库目录
 ->.任何.pth文件的内容(如果存在.pth文件)
>>这四个组件组合起来即为sys.path所包含的路径,而Python会选择在搜索路径中的第一个符合导入文件名的文件
In [1]: import sys
In [2]: sys.path
Out[2]: 
['',
 '/usr/bin',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages/IPython/extensions']

3.自定义模块

[root@linux-node1 ~]# mkdir -pv /tmp/python27/lib
mkdir: created directory ‘/tmp/python27’
mkdir: created directory ‘/tmp/python27/lib’
[root@linux-node1 ~]# vim /tmp/python27/lib/mymod.py
#!/usr/bin/python2
#
x = 30

def printInfo():
    print x + 30

class MyClass():
    data = 'hello myclass'
    def __init__(self,who):
        self.name = who
    def printName(self):
        print self.data,self.name

if __name__ == '__main__':
    printInfo()
    ins1 = MyClass('jerry')
    print ins1.data
    print ins1.name
[root@linux-node1 ~]# chmod +x /tmp/python27/lib/mymod.py
In [2]: sys.path.append('/tmp/python27/lib')
In [4]: import mymod
In [5]: mymod.
mymod.MyClass mymod.printInfo mymod.x 

In [5]: ins1 = mymod.MyClass('tom')

In [6]: ins1.data
Out[6]: 'hello myclass'

In [7]: ins1.
ins1.data ins1.name ins1.printName 

In [7]: ins1.name
Out[7]: 'tom'

In [8]: mymod.__name__
Out[8]: 'mymod'

补充:
__file__:取相对路径
os.path.abspath(__file__):把相对路径变成绝对路径

2.Python包

>>包用于将一组模块归并到一个目录中,次目录及为包,目录名及为包名
 ->.包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的Python应用程序执行环境
 ->.基于包,Python在执行导入时可以指定模块的导入路径
  #.import dir1.dir2.mod1

2.1.模块的顶层执行及被导入

>>一个模块文件可以同时支持顶层执行(作为顶层文件)或被导入(作为模块文件)
 ->.每个模块都有一个名为__name__的内置属性,Python会自动设置该属性
  #.如果文件是以顶层程序文件执行,在启动时,__name__的值为"__main__"
  #.如果是被导入,则__name__的值为模块名
 ->.可以在模块文件中检测自己的__name__属性,以之实现在执行时运行指定的代码
 ->.常用于模块的自我测试
#!/usr/bin/python2
#
def testFunc():
    print "Hello, there..."

if __name__ == "__main__":
    testFunc()

2.2.发布Python模块或程序

>>Python模块、扩展和应用程序可以按以下几种形式进行打包和发布
 ->.压缩文件(使用distutils)
  #.windows的zip文件和类Unix平台的.tar.gz文件
 ->.自动解包或自动安装可执行文件
  #.Windows中的.exe文件
 ->.自包含的,不要求安装的预备运行可执行程序
  #.Windows的.exe文件、Unix上带有一个小的脚本前缀的zip压缩文件、Mac上的.app文件等
 ->.平台相关的安装程序
  #.Windows上的.msi文件、Linux上常见的.rpm、src.rpm和.deb文件等
 ->.Python eggs
  #.较流行的第三方扩展

1.使用disutils发布模块

>>distutils模块能够帮助完成模块或程序发布
 ->."发布"是指一个文件集合,这些文件联合在一起可使用distutils构建、打包和发布模块
 ->.创建好的发布可以用于安装,也可上传到PyPI与他人共享
>>创建发布
 ->.将各代码文件组织到模块容器中
 ->.准备一个README和README.txt文件
 ->.而后在容器中创建setup.py文件
from distutils.core import setup

setup(
    name           ='testmod',
    version        ='0.0.1',
    author         ='xionghaizi',
    author_email   ='linuxedu@foxmail.com',
    py_modules     ='['testmod']',
    url            ='https://www.xionghaier.cn',
    description    ='A simple module.',
)

2.Python打包

python setup.py sdist

 可以为sdist指定格式--formats=
 zip:zip file
 gztar: tar.gz file
 batar: tar.bz2 file
 ztar: tar.Z file
 tar: tar file

python setup.py bdist
 
 可以为ddist指定格式--formats=
 zip:zip file
 gztar: tar.gz file
 ztar: tar.Z file
 tar: tar file
 rpm:RPM Package
 pkgtool:Solaris pkgtool
 wininst:Window上自解压的zip格式的包
 msi:microsoft installer

 bdist_dump
 bdist_rpm
 bdist_wininst
 bdist_msi

获取帮助的方式
 python setup.py --help
 python setup.py --help-commands:所有可以使用的命令。如build,install
 python setup.py COMMAND --help:获取特定命令的帮助
 python setup.py COMMAND --help-formats:获取特定命令支持使用的格式

3.Python执行环境

3.1Python解释器环境与选项

>>Python解释器启动
 ->.python [option] [-c cmd| filename| - ] [args]

3.2doctest模块

>>创建可自测试的模块
 ->.在模块的尾部添加如下代码即可
  #.if __name__ == '__main__':
        import doctest
        doctest.testmod()
 ->.此类模块在python解释器中直接运行时即能进行自我测试

4.Python编程之MySQLdb模块

#下载安装MySQLdb
链接:https://pan.baidu.com/s/1hpkWJp1EKcuKxUf9OCh8Sw 
提取码:3fbs 
[root@linux-node1 ~]# tar xf setuptools-1.1.4.tar.gz 
[root@linux-node1 ~]# cd setuptools-1.1.4/
[root@linux-node1 setuptools-1.1.4]# python2 setup.py build
[root@linux-node1 setuptools-1.1.4]# python2 setup.py install
[root@linux-node1 setuptools-1.1.4]# cd 
[root@linux-node1 ~]# tar xf MySQL-python-1.2.3.tar.gz
#MySQL-python-1.2.3.tar.gz安装失败解决办法
[root@linux-node1 ~]# wget http://ftp.ntu.edu.tw/MySQL/Downloads/Connector-Python/mysql-connector-python-1.2.0.tar.gz
# install it:
$ tar zxf mysql-connector-python-1.2.0.tar.gz
$ cd mysql-connector-python-1.2.0
$ python2.7 setup.py build
$ sudo python2.7 setup.py install
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@linux-node1 MySQL-python-1.2.3]# yum install python-devel mysql-devel
[root@linux-node1 MySQL-python-1.2.3]# python2 setup.py build
[root@linux-node1 MySQL-python-1.2.3]# python2 setup.py install
[root@linux-node1 ~]# ipython
In [1]: help('modules')
In [3]: import MySQLdb as mysql
In [3]: conn = mysql.connect(host='127.0.0.1',user='root',passwd='')
In [5]: conn.stat()
Out[5]: 'Uptime: 730 Threads: 1 Questions: 6 Slow queries: 0 Opens: 67 Flush tables: 1 Open tables: 60 Queries per second avg: 0.008'
cur = conn.cursor() ##游标
cur.execute('show databases')
Out[10]: 3L
sqlsm = 'create table t1 ( id int(4), name varchar(16) ) ENGINE=innodb default charset=gbk;'
cur.execute(sqlsm)
Out[21]: 0L
In [26]: sqlins = 'insert into t1 values (%s)'

In [27]: sqlins = 'insert into t1 (name) values (%s)'

In [28]: cur.execute(sqlins,'tom')
Out[28]: 1L
In [32]: cur.execute('select * from t1')
Out[32]: 3L

In [33]: cur.fetchall()
Out[33]: ((None, 'tom'), (None, 'tom1'), (None, 'tom2'))

5.Python编程之socket模块

socket.socket(family,type)
   family
        AF_INET:
        AF_UNIX:
    type:
        STREAM: TCP
        SOCK_DGRAM: udp
    tcpconn = socker.socket(socker.AF_INET,socket.SOCK_STREAM)
第二步:绑定地址
     使用套接字对象的bind方法绑定于某地址和端口
      tcpconn.bind(('ip',port))
第三步:使用listen方法进入监听状态
     tcpconn.listen(backlog)
     tcpconn.listen(20)
第四步:循环监听状态
     使用套接字对象的accept方法接收用户请求,ci,cp = tcpconn.accept()

编写客户端程序
     第一步:创建一个socket对象,以连接服务器端:
        clientsock = socker.socket(socker.AF_INET,socket.SOCK_STREAM)
      第二步:连接至服务器
        clientsock.connect(('server_ip',port))
      第三步:发送请求
         clientsock.send()
服务器端
import socker
s = socker.socket(socker.AF_INET,socket.SOCK_STREAM)
sa = ('172.16.100.7',8023)
s.bind(sa)
s.listen(20)
while True:
    cinfo,caddr = s.accept()
    pront "Got a conntion from %s" %caddr[0]
    data = cinfo.recv(1024)
    print "Receive data: %s" %data
    cinfo.send("echo: " + data)
    cinfo.close()
客户端:
import socker
c = socker.socket(socker.AF_INET,socket.SOCK_STREAM)
saddr = ('172.16.100.7',8023)
c.connect(saddr)
c.send('hello server')
data = c.recv(1024)
print "Reply from server %s" %data

 

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!