10.2. 标准输入、输出和错误

UNIX 用户已经对标准输入、标准输出和标准错误的概念非常熟悉了。这一节是为其他不熟悉的人准备的。

标准输入和标准错误 (通常缩写为 stdoutstderr) 是内建在每一个 UNIX 系统中的管道。当你 print 某些东西时,结果前往 stdout 管道;当你的程序崩溃并打印出调试信息 (例如 Python 中的 traceback (错误跟踪)) 的时候,信息前往 stderr 管道。通常这两个管道只与你正在工作的终端窗口相联,所以当一个程序打印时,你可以看到输出,而当一个程序崩溃时,你可以看到调试信息。(如果你正在一个基于窗口的 Python IDE 上工作,stdoutstderr 缺省为你的“交互窗口”。)

例 10.8. stdoutstderr 介绍

>>> for i in range(3):
...     print 'Dive in'             
Dive in
Dive in
Dive in
>>> import sys
>>> for i in range(3):
...     sys.stdout.write('Dive in') 
Dive inDive inDive in
>>> for i in range(3):
...     sys.stderr.write('Dive in') 
Dive inDive inDive in
正如在例 6.9 “简单计数”中看到的,时时彩计划软件公式:你可以使用 Python 内置的 range 函数来构造简单的计数循环,即重复某物一定的次数。
stdout 是一个类文件对象;调用它的 write 函数可以打印出你给定的任何字符串。实际上,这就是 print 函数真正做的事情;它在你打印的字符串后面加上一个硬回车,然后调用 sys.stdout.write 函数。
在最简单的例子中,stdoutstderr 把它们的输出发送到相同的地方:Python IDE (如果你在一个 IDE 中的话),或者终端 (如果你从命令行运行 Python 的话)。和 stdout 一样,stderr 并不为你添加硬回车;如果需要,要自己加上。

stdoutstderr 都是类文件对象,就像在第 10.1 节 “抽象输入源”中讨论的一样,但是它们都是只写的。它们都没有 read 方法,只有 write 方法。然而,它们仍然是类文件对象,因此你可以将其它任何 (类) 文件对象赋值给它们来重定向其输出。

例 10.9. 重定向输出

[you@localhost kgp]$ python stdout.py
Dive in
[you@localhost kgp]$ cat out.log
This message will be logged instead of displayed

(在 Windows 上,你要使用 type 来代替 cat 显示文件的内容。)

如果您还没有下载本书附带的样例程序, 可以 下载本程序和其他样例程序

#stdout.py
import sys

print 'Dive in'                                          
saveout = sys.stdout                                     
fsock = open('out.log', 'w')                             
sys.stdout = fsock                                       
print 'This message will be logged instead of displayed' 
sys.stdout = saveout                                     
fsock.close()                                            
打印输出到 IDE交互窗口” (或终端,如果从命令行运行脚本的话)。
始终在重定向前保存 stdout,这样的话之后你还可以将其设回正常。
打开一个新文件用于写入。如果文件不存在,将会被创建。如果文件存在,将被覆盖。
所有后续的输出都会被重定向到刚才打开的新文件上。
这样只会将输出结果“打印”到日志文件中;在 IDE 窗口中或在屏幕上不会看到输出结果。
在我们将 stdout 搞乱之前,让我们把它设回原来的方式。
关闭日志文件。

重定向 stderr 以完全相同的方式进行,只要把 sys.stdout 改为 sys.stderr

例 10.10. 重定向错误信息

[you@localhost kgp]$ python stderr.py
[you@localhost kgp]$ cat error.log
Traceback (most recent line last):
  File "stderr.py", line 5, in ?
    raise Exception, 'this error will be logged'
Exception: this error will be logged

如果您还没有下载本书附带的样例程序, 可以 下载本程序和其他样例程序

#stderr.py
import sys

fsock = open('error.log', 'w')               
sys.stderr = fsock                           
raise Exception, 'this error will be logged' 
打开你要存储调试信息的日志文件。
将新打开的日志文件的文件对象赋值给 stderr 以重定向标准错误。
引发一个异常。从屏幕输出上可以注意到这个行为没有 在屏幕上打印出任何东西。所有正常的跟踪信息已经写进 error.log
还要注意你既没有显式关闭日志文件,也没有将 stderr 设回最初的值。这样挺好,因为一旦程序崩溃 (由于引发的异常),Python 将替我们清理并关闭文件,因此永远不恢复 stderr 不会造成什么影响。然而对于 stdout,恢复初始值相对更为重要――你可能会在后面再次操作标准输出。

向标准错误写入错误信息是很常见的,所以有一种较快的语法可以立刻导出信息。

例 10.11. 打印到 stderr

>>> print 'entering function'
entering function
>>> import sys
>>> print >> sys.stderr, 'entering function' 
entering function
print 语句的快捷语法可以用于写入任何打开的文件 (或者是类文件对象)。在这里,你可以将单个 print 语句重定向到 stderr 而且不用影响后面的 print 语句。

另一方面,标准输入是一个只读文件对象,它表示从前一个程序到这个程序的数据流。这个对于老的 Mac OS 用户和 Windows 用户可能不太容易理解,除非你受到过 MS-DOS 命令行的影响。在 MS-DOS 命令行中,你可以使用一行指令构造一个命令的链,使得一个程序的输出就可以成为下一个程序的输入。第一个程序只是简单地输出到标准输出上 (程序本身没有做任何特别的重定向,只是执行了普通的 print 语句等),然后,下一个程序从标准输入中读取,操作系统就把一个程序的输出连接到一个程序的输入。

例 10.12. 链接命令

[you@localhost kgp]$ python kgp.py -g binary.xml         
01100111
[you@localhost kgp]$ cat binary.xml                      
<?xml version="1.0"?>
<!DOCTYPE grammar PUBLIC "-//diveintopython.org//DTD Kant Generator Pro v1.0//EN" "kgp.dtd">
<grammar>
<ref id="bit">
  <p>0</p>
  <p>1</p>
</ref>
<ref id="byte">
  <p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
<xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
</ref>
</grammar>
[you@localhost kgp]$ cat binary.xml | python kgp.py -g - 
10110001
正如你在第 9.1 节 “概览”中看到的,该命令将只打印一个随机的八位字符串,其中只有 0 或者 1
该处只是简单地打印出整个 binary.xml 文档的内容。(Windows 用户应该用 type 代替 cat。)
该处打印 binary.xml 的内容,但是“|”字符,称为“管道”符,说明内容不会打印到屏幕上;它们会成为下一个命令的标准输入,在这个例子中是你调用的 Python 脚本。
为了不用指定一个文件 (例如 binary.xml),你需要指定“-”,它会使得你的脚本从标准输入载入脚本,而不是从磁盘上的特定文件。 (下一个例子更多地说明了这是如何实现的)。所以效果和第一种语法是一样的,在那里你要直接指定语法文件,但是想想这里的扩展性。让我们把 cat binary.xml 换成别的什么东西――例如运行一个脚本动态生成语法――然后通过管道将它导入你的脚本。它可以来源于任何地方:数据库,或者是生成语法的元脚本,或者其他。你根本不需要修改你的 kgp.py 脚本就可以并入这个功能。你要做的仅仅是从标准输入取得一个语法文件,然后你就可以将其他的逻辑分离出来,放到另一程序中去了。

本文地址:http://www.bhlaab.com/docs/dive-into-python/html/scripts_and_streams/stdin_stdout_stderr.html
文章摘要:,麟子凤雏不事边幅王斌余,右键点击桌巾因您。

那么脚本是如何“知道”在语法文件是“-”时从标准输入读取? 其实不神奇;它只是代码。

时时彩计划软件公式

例 10.13. 在 kgp.py 中从标准输入读取


def openAnything(source):
    if source == "-":    
        import sys
        return sys.stdin

    # try to open with urllib (if source is http, ftp, or file URL)
    import urllib
    try:

[... snip ...]
这是 toolbox.py 中的 openAnything 函数,以前在第 10.1 节 “抽象输入源”中你已经检视过了。所有你要做的就是在函数的开始加入 3 行代码来检测源是否是“-”;如果是,返回 sys.stdin。就这么简单!记住,stdin 是一个拥有 read 方法的类文件对象,所以其它的代码 (在 kgp.py 中,在那里你调用了 openAnything) 一点都不需要改动。
黄金时时彩计划软件 双色球杀号定胆彩乐乐 江西时时彩遗漏大全 时时彩定位胆稳赚技巧 拉菲2平台重庆时时彩
博彩 江西时时彩012路遗漏 时时彩大底验证软件 眉山时时彩qq群号 时时彩软件魅影
内蒙古时时彩黑彩票骗局 时时彩不倍投赚钱妙招 时时彩注册送38元平台 时时彩龙虎开奖记录 江西时时彩2017
苹果重庆时时彩软件免费版 武林至尊时时彩破解版 江西时时彩后一技巧 支持信用卡充值的平台 重庆时时彩被黑客攻击
山东十一选五吧 福利彩票开奖号码 香港六合彩现场报码 北京赛车pk10技巧玩法分析 东京28开奖结果
北京11选5预测专家 广西快3走势图表,福建福彩快三走势图,安徽快3 四川蓥峰实业破产2017 3d试机号分析 浙江十一选五彩票控
2017全国严查麻将赌博棋牌室 安徽快3走势图分布图 幸运28在线预测网站 中国福利彩票双色球游戏规则 急速赛车游戏
36选7中奖规则 秒速飞艇技巧 彩票吉林11选5查询 重庆时时彩预测辅助工具下载 秒速飞艇上什么