2

我的程序的一部分是:

f = open('test.txt')
for line in f.readlines():
    print 'test'
    exit()

为什么第一次遇到出口不能立即退出程序?相反,我的程序将在循环完成时退出。

编辑

它发生在交互模式下:

In [1]: f = open('test.txt', 'r')

In [2]: for line in f.readlines():
   ...:     print 'test'
   ...:     exit()
   ...:     
test
test
test
test
test
test
4

2 回答 2

4

exitIPython 中的函数与exitPython 中的函数不同。在 IPython 中,exit是一个实例IPython.core.autocall.ExitAutocall

In [6]: exit?
Type:       ExitAutocall
String Form:<IPython.core.autocall.ExitAutocall object at 0x9f4c02c>
File:       /data1/unutbu/.virtualenvs/arthur/local/lib/python2.7/site-packages/ipython-0.14.dev-py2.7.egg/IPython/core/autocall.py
Definition: exit(self)
Docstring:
An autocallable object which will be added to the user namespace so that
exit, exit(), quit or quit() are all valid ways to close the shell.
Call def:   exit(self)

In [7]: type(exit)
Out[7]: IPython.core.autocall.ExitAutocall

它的定义如下所示:

class ExitAutocall(IPyAutocall):
    """An autocallable object which will be added to the user namespace so that
    exit, exit(), quit or quit() are all valid ways to close the shell."""
    rewrite = False

    def __call__(self):
        self._ip.ask_exit()

self._ip.ask_exit()调用运行此方法:

def ask_exit(self):
    """ Ask the shell to exit. Can be overiden and used as a callback. """
    self.exit_now = True

所以它实际上并没有退出 IPython,它只是在控制返回到 IPython 提示符时设置一个退出标志。

于 2013-04-08T12:44:18.023 回答
3

它对我来说很好:

sandbox $ wc -l test.tex
       9 test.tex
sandbox $ python test.py | wc -l
       1

所以这可能不是你的实际代码。

但是,有几个原因可能会让您认为自己没有退出。 file.readlines()将所有行存储在列表中。进一步file.read*的行为就像你已经到达文件的末尾(因为你有!)。

要逐行遍历文件,请使用成语:

for line in f:
    do_something_with(line)

或者,使用sys.exit. “内置”exit功能实际上仅用于交互使用。(事实上​​,根据文档,它根本不是“内置”,所以你绝对可以使用不同的 python 实现从中获得有趣的行为)。

于 2013-04-08T12:42:37.870 回答