python学习笔记12-模块使用
模块os,sys
什么是模块?
模块os,sys
模块是Python组织代码的一种基本方式
一个Python脚本可以单独运行,也可以导入到另外一个脚本运行,用import hello语句来导入,不用加入.py
什么是Python的 包?
Python的模块可以按照目录组织为包
创建一个包的步骤:
创建一个名字为包名的目录
在改目录下创建一个__init__.py文件
根据需要,在该目录下存放脚本文件或已编译的扩展及子包
import pack.m1,pack.m2,pack.m3
查看Python
sys.path
export PYTHONPAT
In [311]: import sys In [312]: sys.path Out[312]: ['', '/usr/local/bin', '/usr/local/lib/python27.zip', '/usr/local/lib/python2.7', '/usr/local/lib/python2.7/plat-linux2', '/usr/local/lib/python2.7/lib-tk', '/usr/local/lib/python2.7/lib-old', '/usr/local/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages/IPython/extensions', '/root/.ipython'] In [313]: import string In [314]: import t --------------------------------------------------------------------------- ImportError Traceback (most recent call last) <ipython-input-314-c2d7a4e4fb09> in <module>() ----> 1 import t ImportError: No module named t#找不到这个模块 [root@133 ~]# ls /usr/local/lib/python2.7/string.py /usr/local/lib/python2.7/string.py [root@133 ~]# ls /usr/local/lib/python2.7/os.py /usr/local/lib/python2.7/os.py
自定义python的path,一些自己开发的工具可以放在该目录下
方法一:通过sys.path.append('/root/library')
[root@133 ~]# mkdir /root/library In [315]: sys.path.append('/root/library') In [316]: sys.path Out[316]: ['', '/usr/local/bin', '/usr/local/lib/python27.zip', '/usr/local/lib/python2.7', '/usr/local/lib/python2.7/plat-linux2', '/usr/local/lib/python2.7/lib-tk', '/usr/local/lib/python2.7/lib-old', '/usr/local/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages/IPython/extensions', '/root/.ipython', '/root/library']
方法二、修改/root/.bashrc
[root@133 ~]# vim /root/.bashrc
添加一行:export PYTHONPATH=/root/library
[root@133 ~]# . /root/.bashrc [root@133 ~]# echo $PYTHONPATH /root/library [root@133 ~]# ipython In [2]: import sys In [3]: sys.path Out[3]: ['', '/usr/local/bin', '/root/library', '/usr/local/lib/python27.zip', '/usr/local/lib/python2.7', '/usr/local/lib/python2.7/plat-linux2', '/usr/local/lib/python2.7/lib-tk', '/usr/local/lib/python2.7/lib-old', '/usr/local/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages/IPython/extensions',
实例:
In [2]: with open('/etc/hosts') as fd: ...: s = fd.read() In [4]: s.count('\n') #统计行数,使用\n换行符作为分割的标准 Out[4]: 19 [root@133 ~]# vim wordcount.py #!/usr/bin/python def wordCount(s): chars = len(s) #统计字符数 words = len(s.split()) #统计单词数量, lines = s.count('\n') #统计行数,以\n出现的次数为标准,不能使用lines=len(s.split('\n')),这样最后结尾的\n会多统计一行None print lines,words,chars s = open('/etc/passwd').read() wordCount(s) [root@133 ~]# python wordcount.py 42 71 2051 [root@133 ~]# wc /etc/passwd 42 71 2051 /etc/passwd [root@133 ~]# vim wordcount.py [root@133 ~]# vim wc.py #默认是找的当前目录下的 #!/usr/bin/python import wordcount #导入模块 [root@133 ~]# python wc.py 42 71 2051 [root@133 ~]# ll #当wordcount.py被当成模块使用的时候,会产生编译文件wordcount.pyc,当再次引用,效率更高 总用量 36 drwxr-xr-x 2 root root 4096 9月 8 04:30 library -rw-r--r-- 1 root root 38 9月 8 04:59 wc.py -rw-r--r-- 1 root root 182 9月 8 04:54 wordcount.py -rw-r--r-- 1 root root 424 9月 8 05:00 wordcount.pyc [root@133 function]# vim wc.py #!/usr/bin/python import wordcount s= """ hello word python""" wordcount.wordCount(s) [root@133 function]# python wc.py 42 71 2051 #password 信息 1 3 19 #字符串s的信息 如果我只想得到字符串s的信息,但是不想得到/etc/passwd信息?如何保证原模块不变? 先打印print __name__ [root@133 function]# vim wordcount.py #!/usr/bin/python def wordCount(s): chars = len(s) words = len(s.split()) lines = s.count('\n') print lines,words,chars print __name__ #s = open('/etc/passwd').read() #wordCount(s) [root@133 function]# python wordcount.py #打印输出的是__main__ __main__ [root@133 function]# python wc.py #其他的脚本调用打印的是wordcount,不是__main__,这个可以作为判断的依据 19 74 1534 wordcount 1 2 28 [root@133 function]# vim wc.py #!/usr/bin/python import wordcount s= """ hello word python""" wordcount.wordCount(s) [root@133 function]# python wc.py wordcount #打印的是调用模块的名字,来自wordcount.py 1 3 19 #这个是我们需要的定义s的行数,单词书和字符数 [root@133 function]# vim wordcount.py #!/usr/bin/python def wordCount(s): chars = len(s) words = len(s.split()) lines = s.count('\n') print lines,words,chars if __name__ == '__main__': #这里判断是不是直接调用wordcount.py,是的话,后台是显示__main__,那么执行wordCount(s)函数,打印/etc/passwd行数、单词和字符数量 s = open('/etc/passwd').read() wordCount(s) [root@133 function]# python wordcount.py 42 71 2051 [root@133 function]# python wc.py 1 3 19 这样wordcount.py就可以被其他脚本调用,且被其他脚本wc.py调用的时候不打印第一个脚本不必要的信息。
包,如果想把function目录当做包使用,首先在function目录下创建一个__init__.py文件
[root@133 python]# ll 总用量 12 drwxr-xr-x 2 root root 4096 9月 5 06:29 filevalue drwxr-xr-x 2 root root 4096 9月 8 05:21 function -rw-r--r-- 1 root root 26 9月 2 23:05 README.md [root@133 python]# touch function/__init__.py [root@133 python]# ipython #function是包,wordcount是模块,wordCount是类(方法) In [1]: from function import wordcount #from 包 import 模块 In [2]: wordcount.wordCount('abc') #调用模块.方法() 0 1 3 #一行,三个字符 In [5]: import function.wordcount #或者通过这种方法导入包,import 包.模块 In [6]: function.wordcount.wordCount('hello,world\n')#包.模块.方法(参数) 1 1 12 In [7]: from function.wordcount import wordCount # from 包.模块 import 类(方法) In [8]: wordCount('abc\ndef') 1 2 7 In [9]: from function.wordcount import wordCount as wc#from 包.模块 import 类 as 方法wc In [10]: wc('abc\n\def\n') 2 2 9
总结:模块是一个可以导入Python脚本文件:
包是一些按照目录组织的模板和子包,目录下有__init__.py文件,此文件可以存放包的信息:
导入模块和包的语法(多种方式):
import , import as
from 包 import 模块
from 包.模块 import 类