不理解sys模块的这个用法

3 投票
3 回答
935 浏览
提问于 2025-04-17 09:16

这里是《A Byte of Python》教程中的一段代码:

import sys

filename = 'poem.txt'

def readfile(filename):
    #Print a file to standard output
    f = file(filename)
    while True:
        line = f.readline()
        if len(line) == 0:
            break
        print line,
    f.close()

if len(sys.argv) < 2:
    print 'No action specified'
    sys.exit() //<--This is where the error is occurring

if sys.argv[1].startswith('--'):
    option = sys.argv[1][2:] #fetches sys.argv[1] without first 2 char
    if option == 'version':
        print 'Version 1.2'

    elif option == 'help':
        print '''\
This program prints files to the standard output.
Any number of files can be specified.
Options include:
    --version: Prints the version number
    --help: Displays this help'''

    else:
        print 'Unknown option'
    sys.exit()

else:
    for filename in sys.argv[1:]:
        readfile(filename)

当我运行这段代码时,出现了这个错误:

Traceback (most recent call last):
  File "C:/Python/sysmodulepr.py", line 17, in <module>
    sys.exit()
SystemExit

我不明白为什么会这样。请帮帮我。

3 个回答

1

这不是一个错误。sys.exit() 会引发一个叫 SystemExit 的异常,这样可以让 try:... finally 这个代码块去清理之前使用的资源。

你可以在 Idle 中试试:

import sys

sys.exit()

关于 sys.exit() 的文档中提到:

从 Python 中退出。这是通过引发 SystemExit 异常来实现的,因此在 try 语句的 finally 子句中指定的清理操作会被执行,而且可以在外层拦截退出尝试。

编辑

通常情况下,这个错误不会被打印出来,除非你在一些交互式解释器中运行脚本(比如 Idle)。这没什么好担心的,但这个脚本看起来是独立的,所以你应该把它当作独立的脚本来使用。

2

如果你在用IDLE这个工具,它会显示出错误的堆栈信息。你可以试着从命令行运行你的脚本,这样在IDE外面执行的时候就不会显示那个错误信息了。

3

它告诉你,程序的第17行执行了sys.exit()这个命令。

在Python文档中关于sys.exit的说明告诉你,这个命令会让你的程序退出。

这行代码执行的时候肯定会有其他输出,所以我觉得问题中可能缺少了一些信息。

撰写回答