如何在交互式Python程序中返回输入提示并仍然能够中止正在运行的操作

问题描述 投票:0回答:1

我编写了一个交互式 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 >

如何修改它以在第二种情况下不杀死程序?

python error-handling signals interactive
1个回答
0
投票

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
,但没有什么可以跳过的。

© www.soinside.com 2019 - 2024. All rights reserved.