我的部分计划是:
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
答案 0 :(得分:4)
exit
与Python中的exit
功能不同。
在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提示符时退出。
答案 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实现从中获得有趣的行为)。