如何在Python脚本中暂停并等待命令输入

24

在Python中是否有可能编写以下脚本?

...
Pause
->
Wait for the user to execute some commands in the terminal (e.g.
  to print the value of a variable, to import a library, or whatever).
The script will keep waiting if the user does not input anything.
->
Continue execution of the remaining part of the script

本质上,该脚本暂时将控制权交给Python命令行解释器,并在用户完成该部分后恢复。


我想到的(受答案启发)类似于以下内容:

x = 1

i_cmd = 1
while True:
  s = raw_input('Input [{0:d}] '.format(i_cmd))
  i_cmd += 1
  n = len(s)
  if n > 0 and s.lower() == 'break'[0:n]:
    break
  exec(s)

print 'x = ', x
print 'I am out of the loop.'

这个问题正在询问一个REPLRead-Eval-Print-Loop)。有几个类似问题的建议,包括code.InteractiveInterpreter()pdb - Possum
5个回答

40

如果你正在使用Python 2.x: raw_input()

Python 3.x: input()

示例:

# Do some stuff in script
variable = raw_input('input something!: ')
# Do stuff with variable

谢谢,但也许我没有表达清楚。我的意思是,脚本在某个点停止(在编写脚本时指定位置),然后将控制权交给解释器,以便用户可以做任何他/她想做的事情,例如打印一些内容,导入一些库,甚至完全退出整个脚本。这在一些科学计算脚本语言中很常见(如IDL),但我不确定在Python中是否可能。我想原始输入(raw_input())函数不能做到这一点? - FJDU
也许我可以使用exec()来执行raw_input返回的字符串。 - FJDU
嗯,我不知道有没有办法在脚本运行中完全控制解释器...你可能可以通过使用eval()函数并使用它来执行用户输入的任何内容,然后做一些巧妙的事情来保持它开放。 - Cameron Sparr
但是 input 确实会读取和运行 Python 代码!只需将其放入循环中并检查是否为 'quit'。http://docs.python.org/2/library/functions.html#input - John Mee
@JohnMee 我查看了那个文档并发现它使用的是 eval 而不是 exec,这意味着许多命令无法执行。例如,我不能够 "print x" 或者 "print(x)"。无论如何,我认为我需要将输入或 raw_input 包装在一个无限循环中,并在用户输入类似于 b[reak] 的字符串时终止循环。 - FJDU

8
我知道的最好的方法是使用pdb调试器。因此,请输入:
import pdb

在您的程序顶部放置此代码,然后使用。
pdb.set_trace()

关于“暂停”问题。

在(Pdb)提示符下,您可以输入命令,例如

(Pdb) print 'x = ', x

你也可以逐步执行代码,但这不是你的目标。完成后只需输入

(Pdb) c 

或者任何单词“continue”的子集,代码将恢复执行。

2015年11月的一个很好的关于调试器的简介可以在Python调试中找到,但是如果你谷歌搜索“python 调试器”或“python pdb”,当然还有很多类似的来源。


3

等待用户输入来'继续':

input函数确实会停止脚本的执行,直到用户采取某些操作。以下是一个示例,展示了如何在审查感兴趣的预设变量后手动继续执行:

var1 = "Interesting value to see"
print("My variable of interest is {}".format(var1))
key_pressed = input('Press ENTER to continue: ')

等待预定义时间后继续执行:

另一个我觉得有帮助的情况是加入延迟,这样我可以阅读之前的输出,决定是否在脚本到达一个好的点时使用Ctrl+C终止脚本,但如果我什么也不做则继续执行。

import time.sleep
var2 = "Some value I want to see"
print("My variable of interest is {}".format(var2))
print("Sleeping for 5 seconds")
time.sleep(5) # Delay for 5 seconds

可执行命令行的实际调试器:

请参考上面使用 pdb 步进代码的答案。

参考资料: Python中的time.sleep() - 暂停、停止、等待或睡眠您的Python代码


1
这并没有真正回答问题。如果你仔细阅读问题,OP想要暂停脚本,允许运行多个REPL命令,然后恢复脚本。这个解决方案只是暂停了脚本。 - Michael Kolber
@MichaelKolber 在我最初的帖子之后,我更新了答案以反映为什么我认为我的答案也有帮助(承认PDB答案是特定情况下的“最佳”答案,但大多数人,包括我自己,实际上正在寻找一种不错的快速方法来暂停/等待Python脚本,这正是问题的标题所暗示的!)。这得到了最受欢迎的答案的支持,该答案也没有“回答”OP情况,但也没有像我的提供的那样详细的示例。干杯 - Kelton Temby
答案符合OP的问题标题(如果不是OP的用例),并提供了我正在寻找的内容。 - marianoju

2
我认为您正在寻找这样的内容:
import re

# Get user's name
name = raw_input("Please enter name: ")

# While name has incorrect characters
while re.search('[^a-zA-Z\n]',name):

    # Print out an error
    print("illegal name - Please use only letters")

    # Ask for the name again (if it's incorrect, while loop starts again)
    name = raw_input("Please enter name: ")

2

只需按以下方式使用input()函数:

# Code to be run before pause
input() # Waits for user to type any character and
        # press Enter or just press Enter twice

# Code to be run after pause

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接