我编写了一个交互式 Python 程序,其中包含 100 多个函数,这些函数可以执行我感兴趣的各种计算。
用户在输入提示处输入函数名称,然后执行该函数,结果显示为返回值或副作用。我希望能够通过控制 C 中止长时间运行的函数,而不杀死程序。
这部分我已经完成了。例如,如下所示,如果输入 control-C function2(20) 正在运行,在完成之前的任何时候,该函数都会中止并再次显示输入提示。
但是,如果我不小心在输入提示符下输入control-C,程序就会被终止。我不希望这种事发生;相反,我只想返回到输入提示。由于这两个功能是标准 python 解释器的一部分,所以应该可以做我想做的事情。
这是我所做的一个骨架版本,称为骨架。
#!/Users/richard.gostanian/anaconda3/bin/python
import sys
import signal
import time
def trivial_function(n):
return n
def function2(n):
for i in range(1,n):
print(i)
time.sleep(1)
return n
while True:
entered2 = input("Enter function with arguments: ")
entered=entered2.strip() # remove preceding and trailing whitespace from entered2
if entered == 'q':
print()
quit()
elif entered == "": # go back to the input prompt
print()
continue
else:
try:
result=eval(entered)
print("\n {} = {} \n".format(entered,result))
continue
except KeyboardInterrupt:
print()
continue
如果您在 function2(20) 运行时键入 control-C,则输出如下
Enter function: function2(20)
1
2
3
4
^C
Enter function:
如果您在输入提示符处键入 control-C,则以下是输出
Enter function: ^CTraceback (most recent call last):
File "/Users/richard/home/richard/bin/./skeleton", line 17, in <module>
entered2 = input("Enter function: ")
^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt
bash >
如何修改它以在第二种情况下不杀死程序?
将
try/except
放在整个循环体周围,而不仅仅是对 eval()
的调用。
while True:
try:
entered2 = input("Enter function with arguments: ")
entered=entered2.strip() # remove preceding and trailing whitespace from entered2
if entered == 'q':
print()
quit()
elif entered == "": # go back to the input prompt
print()
else:
result=eval(entered)
print("\n {} = {} \n".format(entered,result))
except KeyboardInterrupt:
print()
您不需要所有这些
continue
陈述。循环会自动继续,除非 while
条件为假或者您使用 break
退出。如果您想跳过循环体的其余部分,则只需使用 continue
,但没有什么可以跳过的。