为什么exit()在readlines循环中不能立即终止程序?

时间:2013-04-08 12:40:05

标签: python ipython readlines

我的部分计划是:

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

2 个答案:

答案 0 :(得分:4)

IPython中的

exit与Python中的exit功能不同。 在IPython中,exitIPython.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提示符时退出。

答案 1 :(得分:3)

对我来说效果很好:

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

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

有几个原因可能会让你认为你不想在你想要的时候退出。 file.readlines()将所有行存储在列表中。进一步file.read*的行为就像你已经到达文件的末尾(因为你有!)。

要逐行迭代文件,请使用idiom:

for line in f:
    do_something_with(line)

或者,使用sys.exit。 “内置”exit函数实际上只是used interactively。 (事实上​​,根据文档,它根本不是“内置”,所以你肯定可以使用不同的python实现从中获得有趣的行为)。