Python文件_管道与模块编写

一,管道(pipe)

大多数操作系统都提供了一个命令行接口,即【shell】。

在 shell 下能够启动的所有程序,也都可以在 Python 中启动,这要用到一个 pipe 对象,这个直接翻译意思为管道的对象,可以理解为 Python 与操作系统的 Shell 进行通信的途径,一个 pipe 对象就代表了一个运行的程序。

1.比如Unix 的 ls -l 命令通常会用长文件名格式来显示当前目录的内容,而在 Python 中就可以用 os.open 来启动它:

>>> import os

>>> cmd = 'ls -l'

>>> fp = os.popen(cmd)

参数 cmd 是包含了 shell 命令的一个字符串。返回的结果是一个对象,用起来就像是一个打开了的文件一样。

2.我们还可以读取ls 进程的输出,用 readline 的话每次读取一行,用 read 的话就一次性全部读取:

>>> res = fp.read()

用完之后要关闭,这点也跟文件一样:

>>> stat = fp.close()

>>> print(stat)

None

返回值是 ls 这个进程的最终状态;None 的意思就是正常退出(没有错误)。

2.md5sum函数可以很有效地检查两个文件是否有相同内容。我们可以用一个 pipe 来从 Python 启动运行 md5sum,然后获取结果:

$ cat c.py

#!/bin/python

import os

filename = 'output.txt'

cmd = 'md5sum ' + filename       #注意,md5sum后面有个空格

fp = os.popen(cmd)

res = fp.read()

stat = fp.close()

print(res)

print(stat)

二,模块编写

任何包含 Python 代码的文件都可以作为模块被导入使用。

1.看个例子,创建一个名字叫wc.py 的文件,里面代码如下:

$ cat wc.py

#!/bin/python

def linecount(filename):

    count = 0

    for line in open(filename):

        count += 1

    return count

print(linecount('wc.py'))

如果运行这个程序,程序就会读取自己本身wc.py,然后输出文件中的行数,也就是7行了:

$ python3 wc.py

7

你还可以导入这个模块:

>>> import wc        #这里的模块名称wc是follow文件名wc.py而来

7

现在你就有一个模块对象 wc 了:

>>> wc

<module 'wc' from '/Users/dianze/python/wc.py'>

而该模块的功能之一是提供了数行数的函数linecount:

>>> wc.linecount('wc.py')

9

>>> wc.linecount('output.txt')

1

这就是用Python来写模块。

2.上例中有个小问题,就是导入模块的时候,模块内代码在最后一行对自身进行了测试。一般情况你导入一个模块,模块只是定义了新的函数,但不会去主动运行自己内部的函数。

所以,以模块方式导入使用的程序,一般用下面这样的惯用形式:

if __name__ == '__main__':

   print(linecount('wc.py'))

name 是一个内置变量,当程序开始运行的时候被设置。如果程序是作为脚本来运行的,name 的值就是'main'。

这样的话,if条件满足,测试代码就会运行;而如果该代码被用作模块导入了,if 条件不满足,测试的代码就不会运行了。

结束。  

原文地址:https://www.cnblogs.com/liusingbon/p/13221518.html