让我们假设我们有一个用python编写的这样一个简单的守护进程:
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
Run Code Online (Sandbox Code Playgroud)
然后我们使用start-stop-daemon默认的send SIGTERM(TERM)信号进行守护--stop.
我们假设当前执行的步骤是#2.在这个时刻,我们正在发送TERM信号.
会发生什么是执行立即终止.
我发现我可以处理信号事件,signal.signal(signal.SIGTERM, handler)但问题是它仍然会中断当前执行并将控制传递给handler.
所以,我的问题是-它可以不中断当前执行,但处理TERM(?)在独立的线程信号,使我能够设置shutdown_flag = True,使mainloop()有机会停止正常?
所以我正在努力学习d3,wiki建议这样做
要在本地查看示例,您必须具有本地Web服务器.任何Web服务器都可以工作; 例如,您可以运行Python的内置服务器:
python -m SimpleHTTPServer 8888 &
很棒...只是现在我有一台服务器正在运行...但在某些时候我想我应该再次关闭它.
关闭它比使用更好的方法kill <pid>吗?对于一份小工作来说,这似乎是一件大事.
(我正在运行Mac OS 10.6.8(Snow Leopard))
FWIW:ctrl+c提供大约10行追溯,抱怨被打断.
kill -3 <pid> 在一个单独的窗口中发出一个Finder警告'Python意外退出'.
默认kill <pid>并且kill -15 <pid>相对干净(而且简单).
我想知道是否可以通过以下方式在python中捕获Control-C:
if input != contr-c:
#DO THINGS
else:
#quit
Run Code Online (Sandbox Code Playgroud)
我已经阅读了有关的内容,但他们try并except KeyboardInterrupt没有为我工作.
Python程序通过Selenium WebDriver驱动Firefox.代码嵌入在try/ exceptblock中,如下所示:
session = selenium.webdriver.Firefox(firefox_profile)
try:
# do stuff
except (Exception, KeyboardInterrupt) as exception:
logging.info("Caught exception.")
traceback.print_exc(file=sys.stdout)
Run Code Online (Sandbox Code Playgroud)
如果程序因错误而中止,则WebDriver会话不会关闭,因此Firefox窗口保持打开状态.但是如果程序以KeyboardInterrupt异常中止,则Firefox窗口会关闭(我想因为WebDriver会话也被释放了),我想避免这种情况.
我知道两个异常都通过相同的处理程序,因为我"Caught exception"在两种情况下都看到了消息.
我怎么能避免关闭Firefox窗口KeyboardInterrupt?
问题: 我有一个设计糟糕的Fortran程序(我无法更改它,我坚持使用它)从stdin和其他输入文件中获取文本输入,并将文本输出结果写入stdout和其他输出文件.输入和输出的大小非常大,我想避免写入硬盘驱动器(慢速操作).我编写了一个函数,迭代几个输入文件的行,我也有多个输出的解析器.我真的不知道程序是否首先读取所有输入然后开始输出,或者在读取输入时开始输出.
目标: 拥有一个为外部程序提供所需功能的函数,并在输出来自程序时解析输出,而无需将数据写入硬盘驱动器上的文本文件.
研究: 使用文件的天真方式是:
from subprocess import PIPE, Popen
def execute_simple(cmd, stdin_iter, stdout_parser, input_files, output_files):
for filename, file_iter in input_files.iteritems():
with open(filename ,'w') as f:
for line in file_iter:
f.write(line + '\n')
p_sub = Popen(
shlex.split(cmd),
stdin = PIPE,
stdout = open('stdout.txt', 'w'),
stderr = open('stderr.txt', 'w'),
bufsize=1
)
for line in stdin_iter:
p_sub.stdin.write(line + '\n')
p_sub.stdin.close()
p_sub.wait()
data = {}
for filename, parse_func in output_files.iteritems():
# The stdout.txt and stderr.txt is included here
with open(filename,'r') as f: …Run Code Online (Sandbox Code Playgroud) 我试图SIGINT在Python 2.7程序中捕获(或键盘中断).这就是我的Python测试脚本的test外观:
#!/usr/bin/python
import time
try:
time.sleep(100)
except KeyboardInterrupt:
pass
except:
print "error"
Run Code Online (Sandbox Code Playgroud)
接下来我有一个shell脚本test.sh:
./test & pid=$!
sleep 1
kill -s 2 $pid
Run Code Online (Sandbox Code Playgroud)
当我使用bash或sh或其他东西运行脚本时,bash test.shPython进程test保持运行并且无法使用SIGINT.而当我复制test.sh命令并将其粘贴到(bash)终端时,Python进程test将关闭.
我不知道发生了什么,我想了解.那么,差异在哪里,为什么?
这不是关于如何捕获SIGINTPython!根据文档 - 这是应该工作的方式:
Python默认安装少量信号处理程序:SIGPIPE ...和SIGINT转换为KeyboardInterrupt异常
这的确是追赶KeyboardInterrupt时SIGINT被发送kill,如果该程序是由外壳直接启动,但是当程序从后台运行bash脚本开始,似乎KeyboardInterrupt永远不会提高.
我在(自制的)基于C的python扩展中运行一些计算量很大的模拟.偶尔我会弄错,想终止模拟.但是,Ctrl-C似乎没有任何效果(除了打印^C到屏幕,所以我必须使用kill或系统监视器终止进程.
据我所知,python只是等待C扩展完成,并且在此期间并没有真正与它通信.
有没有办法让这项工作?
使用python的cmd.Cmd创建自定义CLI时,如何告诉处理程序中止当前行并给我一个新提示?
这是一个最小的例子:
# console_min.py
# run: 'python console_min.py'
import cmd, signal
class Console(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = "[test] "
signal.signal(signal.SIGINT, handler)
def do_exit(self, args):
return -1
def do_EOF(self, args):
return self.do_exit(args)
def preloop(self):
cmd.Cmd.preloop(self)
self._hist = []
self._locals = {}
self._globals = {}
def postloop(self):
cmd.Cmd.postloop(self)
print "Exiting ..."
def precmd(self, line):
self._hist += [ line.strip() ]
return line
def postcmd(self, stop, line):
return stop
def emptyline(self):
return cmd.Cmd.emptyline(self)
def handler(self, signum, frame):
# self.emptyline() does not work here …Run Code Online (Sandbox Code Playgroud) 我正在玩Python和诅咒.
我跑的时候
import time
import curses
def main():
curses.initscr()
curses.cbreak()
for i in range(3):
time.sleep(1)
curses.flash()
pass
print( "Hello World" )
curses.endwin()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
如果我一直等待,curses.endwin()就会被调用,所以一切正常.但是,如果我用Ctrl-C剪短它,curses.endwin()永远不会被调用,所以它搞砸了我的终端会话.
处理这种情况的正确方法是什么?我怎样才能确保无论我如何尝试结束/中断程序(例如Ctrl-C,Ctrl-Z),它都不会弄乱终端?
我正在编写一个Python脚本,pycurl用于使用Twitter的Sreaming API.这是一个简短的代码片段(只需将您的Twitter登录名/密码进行测试):
import pycurl
user = 'USER'
password = 'PWD'
def handleData(data):
print(data)
conn = pycurl.Curl()
conn.setopt(pycurl.USERPWD, "%s:%s" % (user, password))
conn.setopt(pycurl.URL, 'https://stream.twitter.com/1/statuses/sample.json')
conn.setopt(pycurl.WRITEFUNCTION, handleData)
conn.perform()
Run Code Online (Sandbox Code Playgroud)
问题是因为脚本使用流,所以conn.perform()永远不会返回(或很少).因此,我有时需要中断脚本,并且KeyboardInterrupt被perform()方法捕获.
但是,它不能很好地处理它,打印出一个丑陋的错误,并引发一个不同的异常.
^CTraceback (most recent call last):
File "test.py", line 6, in handleData
def handleData(data):
KeyboardInterrupt
Traceback (most recent call last):
File "test.py", line 12, in <module>
conn.perform()
pycurl.error: (23, 'Failed writing body (0 != 2203)')
Run Code Online (Sandbox Code Playgroud)
该卷曲FAQ说,中断正在进行的转移,回调函数(在我的情况handleData),应返回的特殊值.这很棒,但是KeyboardInterrupt没有被任何回调功能捕获!
我怎么能整齐地做到这一点? …