Python 第一次按“Ctrl+”时无法停止程序;C`

Python 第一次按“Ctrl+”时无法停止程序;C`,python,terminate,Python,Terminate,我有一个tcp接收器,正在监听传入的图像。我还有一个foo()def,它同时运行,每5秒打印一次当前时间 代码如下: from __future__ import print_function import socket from struct import unpack import Queue from PIL import Image HOST = '10.0.0.1' PORT = 5005 BUFSIZE = 4096 q = Queue.Queue() class Receiv

我有一个tcp接收器,正在监听传入的图像。我还有一个foo()def,它同时运行,每5秒打印一次当前时间

代码如下:

from __future__ import print_function
import socket
from struct import unpack
import Queue
from PIL import Image


HOST = '10.0.0.1'
PORT = 5005
BUFSIZE = 4096
q = Queue.Queue()

class Receiver:
    ''' Buffer binary data from socket conn '''
    def __init__(self, conn):
        self.conn = conn
        self.buff = bytearray()

    def get(self, size):
        ''' Get size bytes from the buffer, reading
            from conn when necessary 
        '''
        while len(self.buff) < size:
            data = self.conn.recv(BUFSIZE)
            if not data:
                break
            self.buff.extend(data)
        # Extract the desired bytes
        result = self.buff[:size]
        # and remove them from the buffer
        del self.buff[:size]
        return bytes(result)

    def save(self, fname):
        ''' Save the remaining bytes to file fname '''
        with open(fname, 'wb') as f:
            if self.buff:
                f.write(bytes(self.buff))
            while True:
                data = self.conn.recv(BUFSIZE)
                if not data:
                    break
                f.write(data)

import time, threading
def foo():
    try:
        print(time.ctime())
        threading.Timer(5, foo).start()
    except KeyboardInterrupt:
        print('\nClosing')

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    try:
        sock.bind((HOST, PORT))
    except socket.error as err:
        print('Bind failed', err)
        return
    sock.listen(1)
    print('Socket now listening at', HOST, PORT)
    try:
        while True:
            conn, addr = sock.accept()
            print('Connected with', *addr)
            # Create a buffer for this connection
            receiver = Receiver(conn)
            # Get the length of the file name
            name_size = unpack('B', receiver.get(1))[0] 
            # Get the file name itself
            name = receiver.get(name_size).decode()
            q.put(name)
            print('name', name)
            # Save the file
            receiver.save(name)
            conn.close()
            print('saved\n')

    # Hit Break / Ctrl-C to exit
    except KeyboardInterrupt:
        print('\nClosing')

    sock.close()

if __name__ == '__main__':
    foo()
    main()
from\uuuuu future\uuuuu导入打印功能
导入套接字
从结构导入解包
导入队列
从PIL导入图像
主机='10.0.0.1'
端口=5005
BUFSIZE=4096
q=队列。队列()
类别接收人:
''来自套接字连接''的缓冲区二进制数据'
定义初始化(自身,连接):
self.conn=conn
self.buff=bytearray()
def get(自身,大小):
''从缓冲区获取大小字节,正在读取
必要时从康涅狄格州
'''
而len(self.buff)<大小:
数据=self.conn.recv(BUFSIZE)
如果没有数据:
打破
self.buff.extend(数据)
#提取所需的字节
结果=self.buff[:大小]
#并将其从缓冲区中移除
del self.buff[:大小]
返回字节(结果)
def保存(自我,fname):
''将剩余字节保存到文件fname''
将open(fname,'wb')作为f:
如果self.buff:
f、 写入(字节(self.buff))
尽管如此:
数据=self.conn.recv(BUFSIZE)
如果没有数据:
打破
f、 写入(数据)
导入时间,线程
def foo():
尝试:
打印(time.ctime())
threading.Timer(5,foo.start())
除键盘中断外:
打印(“\nClosing”)
def main():
sock=socket.socket(socket.AF\u INET,socket.sock\u流)
sock.setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
尝试:
sock.bind((主机、端口))
除了socket.error作为错误:
打印('绑定失败',错误)
返回
短袜,听(1)
打印('正在侦听的套接字'、主机、端口)
尝试:
尽管如此:
conn,addr=sock.accept()
打印('Connected with',*addr)
#为此连接创建缓冲区
接收器=接收器(连接)
#获取文件名的长度
name_size=unpack('B',receiver.get(1))[0]
#获取文件名本身
name=receiver.get(name\u size).decode()
q、 put(姓名)
打印('名称',名称)
#保存文件
receiver.save(名称)
康涅狄格州关闭
打印('已保存\n')
#点击Break/Ctrl-C退出
除键盘中断外:
打印(“\nClosing”)
sock.close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
foo()
main()
问题是,当我按下
Ctrl+C
按钮以终止程序时,程序第一次打印“closing”但未终止,我应至少按两次这些按钮


如何在第一次按Ctrl+C键时停止程序?我删除了def foo()中的
try
之外的
,但它没有改变结果。

只需在print语句之后重新引发异常:

except KeyboardInterrupt:
    print('\nClosing') 
    raise

只需在print语句后重新引发异常:

except KeyboardInterrupt:
    print('\nClosing') 
    raise

谢谢,但在哪一次例外之后?(其中有两个,一个在
def main()
中,另一个在
def foo()
中)。我是否应该删除def foo()中的
try
而不是
?@helen如果您希望任何ctrl+c中断您的程序,您应该将其同时添加到这两个选项中。谢谢,但在出现异常之后?(其中有两个,一个在
def main()
中,另一个在
def foo()
中)。我是否应该删除def foo()中的
try
而不是
?@helen如果您希望任何ctrl+c中断您的程序,您应该将其添加到这两个选项中。