【问题标题】:How do I restart a program based on user input?如何根据用户输入重新启动程序?
【发布时间】:2013-02-01 03:47:30
【问题描述】:

我正在尝试使用基于用户输入的 if 测试重新启动程序。

此代码不起作用,但它大约是我所追求的:

answer = str(raw_input('Run again? (y/n): '))

if answer == 'n':
   print 'Goodbye'
   break
elif answer == 'y':
   #restart_program???
else:
   print 'Invalid input.'

我想做的是:

  • 如果您回答 y - 程序从顶部重新启动
  • 如果您回答 n - 程序结束(该部分有效)
  • 如果您输入任何其他内容,它应该打印'无效输入。请输入 y 或 n...' 或其他内容,然后再次询问您是否有新的输入。

我非常接近一个带有“while true”循环的解决方案,但是无论您按什么程序都会重新启动(n 除外),或者无论您按什么它都会退出(y 除外)。有什么想法吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    这很容易做到

    while True:
    
           #do something
    
           again = input("Run again? ")
    
           if 'yes' in again:
                  continue
           else:
                  print("Good Bye")
                  break
    

    基本上,在这种情况下,while 循环将一次又一次地运行程序,因为如果条件为 True,则 while 循环将运行,因此我们使条件为真,正如您所知,True 始终为真,绝不为假。所以,不会停止,然后在此之后主要部分首先来到这里,我们将从用户那里获取他们是否要继续程序然后我们会说如果用户说是我想继续然后continue 关键字将再次将循环带到顶部,并且也将再次运行程序,如果用户说其他内容,或者如果您只想在用户说不的情况下退出程序,则可以以另一种方式执行,然后添加这个

    elif 'no' in again:
           print("Good Bye")
           break
    else:
           print("Invalid Input")
    

    这看起来如果输入中有'no'字,如果有那么它将打破循环并且程序将退出

    【讨论】:

    • 欢迎来到 SO。您的代码可能会为问题提供解决方案,但添加有关其工作原理的说明将有助于其他用户更快地解释它。
    • 嘿@Nick 我已经解释了它是如何工作的,所以现在很高兴:)
    【解决方案2】:

    试试这个:

    while True:
        # main program
        while True:
            answer = str(input('Run again? (y/n): '))
            if answer in ('y', 'n'):
                break
            print("invalid input.")
        if answer == 'y':
            continue
        else:
            print("Goodbye")
            break
    

    内部while循环循环直到输入为'y''n'。如果输入为'y',则while 循环再次开始(continue 关键字跳过剩余代码并直接进入下一次迭代)。如果输入为'n',则程序结束。

    【讨论】:

      【解决方案3】:

      你可以简单地用一个函数来做到这一点。例如:

      def script():
          # program code here...
          restart = raw_input("Would you like to restart this program?")
          if restart == "yes" or restart == "y":
              script()
          if restart == "n" or restart == "no":
              print "Script terminating. Goodbye."
      script()
      

      当然你可以在这里改变很多东西。说什么,脚本将接受什么作为有效输入,变量和函数名称。您可以简单地将整个程序嵌套在一个用户定义的函数中(当然,您必须将所有内容都放在一个额外的缩进中)并使用以下代码行随时重新启动它:myfunctionname()。更多关于这个here.

      【讨论】:

      • 当然,如果失败请告诉我,我会尽力修复
      【解决方案4】:

      使用一个while循环:

      In [1]: start = 1
         ...: 
         ...: while True:
         ...:     if start != 1:        
         ...:         do_run = raw_input('Restart?  y/n:')
         ...:         if do_run == 'y':
         ...:             pass
         ...:         elif do_run == 'n':
         ...:             break
         ...:         else: 
         ...:             print 'Invalid input'
         ...:             continue
         ...: 
         ...:     print 'Doing stuff!!!'
         ...: 
         ...:     if start == 1:
         ...:         start = 0
         ...:         
      Doing stuff!!!
      
      Restart?  y/n:y
      Doing stuff!!!
      
      Restart?  y/n:f
      Invalid input
      
      Restart?  y/n:n
      
      In [2]:
      

      【讨论】:

      • 好的,好的。很公平。你不需要 need 2 while 循环——但我仍然认为这样更干净:)——我实际上喜欢我的装饰器解决方案,但对于这样的问题可能有点先进...
      • @mgilson——也许吧。但是装饰器当然非常整洁,+1。
      • 善用while循环
      【解决方案5】:

      此行将无条件从头重新启动正在运行的程序:

      os.execl(sys.executable, sys.executable, *sys.argv)
      

      与目前为止的其余建议相比,它的一个优点是程序本身将被再次读取。

      这可能很有用,例如,如果您在另一个窗口中修改其代码。

      【讨论】:

      • 如果 Python 安装在带空格的路径中,这在 Windows 上不起作用
      • @Beefster 这可以通过使用subprocess.call(sys.executable + ' "' + os.path.realpath(__file__) + '"')来解决
      • @EladAvron 该解决方案的问题在于它创建了无穷无尽的子进程链,最终将导致操作系统内存不足。我不确定那时会发生什么。
      • @Beefster 这取决于用例,但这确实是一种可能性。也许有一种方法可以在打开一个新子进程时关闭所有以前的子进程,但我还没有研究过。
      • 这样解决了python安装路径不能有空格的问题。 os.execl(sys.executable, '"{}"'.format(sys.executable), *sys.argv)
      【解决方案6】:

      这是使用decorator 的有趣方式:

      def restartable(func):
          def wrapper(*args,**kwargs):
              answer = 'y'
              while answer == 'y':
                  func(*args,**kwargs)
                  while True:
                      answer = raw_input('Restart?  y/n:')
                      if answer in ('y','n'):
                          break
                      else:
                          print "invalid answer"
          return wrapper
      
      @restartable
      def main():
          print "foo"
      
      main()
      

      最终,我认为您需要 2 个 while 循环。您需要一个循环将提示答案的部分括起来,以便在用户输入错误时再次提示。您需要一秒钟来检查当前答案是否为 'y' 并继续运行代码,直到答案不是 'y'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 2015-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多