15 python
我可以在用户中间暂停正在运行的python脚本(在Windows下),并在用户决定时再次恢复吗?
有一个主管理器程序生成,加载和运行其他python脚本(通过从控制台调用python script.py).我没有GUI,用户可以通过console进行交互.我希望我的主程序能够响应用户正在运行的脚本的暂停/恢复命令.我应该定义一个线程吗?方法是什么?
编辑/更新:
假设我有一个带有前端的小型python应用程序,它具有各种功能.我有一个RUN命令在后台运行python脚本.我想实现一个暂停正在运行的python脚本的PAUSE功能.当用户再次命令RUN时,python脚本应该恢复运行.使用raw_input()或print()强制用户发出命令.但在这种情况下,我们不知道用户何时想要中断/暂停/发出命令.因此通常的输入/打印不可用.
Gri*_*ave 14
如果它是unix我会推荐信号,但这里有一个粗略的版本可以满足您的要求.
import time
while True:
try:
time.sleep(1) # do something here
print '.',
except KeyboardInterrupt:
print '\nPausing... (Hit ENTER to continue, type quit to exit.)'
try:
response = raw_input()
if response == 'quit':
break
print 'Resuming...'
except KeyboardInterrupt:
print 'Resuming...'
continue
Run Code Online (Sandbox Code Playgroud)
使用Ctrl + C暂停,然后按ENTER继续.Ctrl + Break可能会被用作严厉杀戮,但我没有这个键盘上的键.
更强大的版本可以在管道/套接字甚至线程上使用select.
小智 9
您可以通过创建一个简单的解决方法PAUSEFILE.您的待暂停脚本可能会定期检查此类文件的存在(或内容).
用户的PAUSE命令可以创建(或填充适当的内容)这样的文件.
我在类似的情况下使用过这种方法,我希望能够暂停我的Python脚本并在以后恢复它们.它们包含类似的东西
if os.path.isfile(PAUSEFILE):
raw_input('Remove ' + PAUSEFILE + ' and hit ENTER to continue')
Run Code Online (Sandbox Code Playgroud)
在他们的主循环中.
它是讨厌的,如果代码真的依赖于它可能会被破坏,但对于用例,用户随机暂停,我想这无关紧要.
该PAUSE命令是简单的touch $PAUSEFILE.
我不太了解你的方法,但每次用户需要按Enter键继续你应该使用的脚本:
input() #for python 3k
raw_input() #for python 2k
Run Code Online (Sandbox Code Playgroud)
没有将接收答案分配给变量.
好的,从我在搜索中看到的情况来看,即使使用线程,sys.stdin也会对您不利,无论您如何处理(input(),甚至sys.stdin.read(), .readline()等),因为它们会阻塞。
相反,将您的管理器程序编写为套接字服务器或类似的东西。
将脚本编写为生成器,这些脚本旨在暂停执行(每次遇到 a 时yield),然后next()依次重复调用每个脚本。StopIteration当脚本完成时,您将收到异常。
为了处理命令,编写连接到管理器程序的套接字并向其发送消息的第二个脚本,这将是用户与之交互的控制台界面(稍后,您甚至可以将其升级为 GUI,而无需对其他地方进行太多更改)。
服务器在脚本上运行下一次迭代之前选择这些命令,如果脚本被用户暂停,管理器程序不会调用next()该脚本,直到用户告诉它再次运行。
我还没有测试过这个,但我认为它比为外部脚本创建线程或子进程,然后尝试暂停(然后杀死)它们会更好。
这真的超出了我的理解,但也许在后台运行脚本并使用kill -stop和kill -cont暂停和继续会起作用(假设是 Linux)?