![](/img/trans.png)
[英]Python: How to prevent subprocesses from receiving CTRL-C / Control-C / SIGINT
[英]PyGame seems to be intercepting SIGINT from Ctrl-C
如果我嘗試使用PyGame屏蔽屏幕,則PyGame似乎攔截了SIGINT,因此我無法使用control-C退出程序。 如果我將代碼簡化為最基本的部分,則如下所示:
import signal
import time
import pygame
class Foo:
def __init__(self):
self.bgcolor = [0,0,0]
pygame.display.init()
pygame.font.init()
pygame.mouse.set_visible(False)
size = (pygame.display.Info().current_w, pygame.display.Info().current_h)
self.screen = pygame.display.set_mode(size, pygame.FULLSCREEN)
self.blank_screen()
def blank_screen(self):
self.screen.fill(self.bgcolor)
pygame.display.update()
#pygame.quit()
def sighandle(self, signal, frame):
print('I got a ctrl-c')
self.close()
def close(self):
print('calling close')
pygame.quit()
def run(self):
print('I am running')
time.sleep(10)
if __name__=='__main__':
bar = None
try:
bar = Foo()
signal.signal(signal.SIGINT, bar.sighandle)
signal.signal(signal.SIGTERM, bar.sighandle)
bar.run()
finally:
print('in finally block')
if bar is not None:
bar.close()
如果我刪除了pygame的各個部分,則ctrl-c可以正常工作,並且會打印sighandle()
的消息。 當我將pygame部件放進去時,屏幕如預期那樣空白,但是ctrl-c被忽略,並且sighandle()
的消息從不打印。 該代碼只是運行完成。 此外,如果我取消注釋pygame.quit()
中已blank_screen()
,則ctrl-c可以再次工作,但是塗黑的屏幕當然會消失。
為什么在我調用PyGame時,代碼會忽略ctrl-c,以及如何使其按預期工作,以便ctrl-c通過sighandle
殺死程序?
經過研究,我發現確實是這種情況。 不過,我沒有在PyGame的文檔中明確提及它。
可以通過在上面的代碼中將Ctrl-C作為事件來啟用。 我可以這樣修改Foo.run()
:
def run(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.sighandle()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_c and pygame.key.get_mods() & pygame.KMOD_CTRL:
print "pressed CTRL-C as an event"
self.sighandle()
print('I am running')
time.sleep(10)
我從Adafruit的VideoLooper中獲取了基於PyGame的屏幕空白代碼,該代碼還包括基於信號庫的SIGINT處理。 但是我也不認為他們的代碼也可以按原樣處理Ctrl-C。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.