系统工具

来源:互联网 发布:如何摆脱贫穷知乎 编辑:程序博客网 时间:2024/05/15 07:23

os.popen()

继续沿用上篇博文中的代码(分页显示脚本):

# more.py# -*- coding: utf-8 -*-def more(text, numline=15):    lines = text.splitlines()   # 将字符串的每一行作为列表元素放入列表中    while lines:        chunck = lines[:numline]        lines = lines[numline:]        for line in chunck:            print(line+'\n')        if lines and input('More?') not in ['Y', 'y']:  # 等待用户输入是否翻页            breakif __name__ == '__main__':    import sys    more(open(sys.argv[1]).read(), 5)   # 显示命令行中文件的页面内容
# more.txt12345678910

通过学习,我了解到通过 os.popen 可以运行shell命令并与其输入或输出流相连接,于是我就打算通过脚本运行上方的python代码并用 read 将其显示到Python界面。

>>> import os>>> output = os.popen('python more.py more.txt')    # 将 popen 返回的对象赋给 output>>> a = output.read()y  # 此处为脚本中input('More?')的输入值>>> b = output.readline()# 并没有再要求输入>>> c = output.readlines()>>> a'1\n\n2\n\n3\n\n4\n\n5\n\nMore?6\n\n7\n\n8\n\n9\n\n10\n\n'>>> b''>>> c[]

很奇怪,为什么 b,c 赋值的时候不要求输入 y 了呢?而且,显然 b, c 一个为空字符串,一个为 list 是错误的。a 应该是正确的不过也看起来不对劲。

让我们从上到下分析这段代码。import 固然是正确的。第二行中,output 接收了 os.popen 返回的打开文件对象(open file object)。

The return value is an open file object connected to the pipe

下一句代码中,read 调用了 output 对象,返回值传给了 a, 并且在执行脚本时,获取了用户输入的 y。在这里我们看一下 read 的文档:

Decodes data from the stream and returns the resulting object.

他会将我们的文件输出流拦截,全部译码为字符串,返回结果对象,除此之外不对输出流中的内容做任何处理。这样就能解释 a 中,为什么会有那么多换行符了。

继续往下,readline 调用 output 对象对吗?对,但是问题就在这里,如果正确执行了 more.py 脚本,那么是会要求用户输入 y 的,这里 more.py 应该没有正确执行。
在这里插入一条关于文件对象的读取规则:文件打开时,通常处于偏移量(whence)为零的位置,并随着数据的传输而向下移动我们使用read读取了pipe中全部的字节字符串,偏移量已经位于文件末尾,当然获得的 b 是空字符串了,c 也是如此。

原创粉丝点击