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 类