Python 第一次按“Ctrl+”时无法停止程序;C`
我有一个tcp接收器,正在监听传入的图像。我还有一个foo()def,它同时运行,每5秒打印一次当前时间 代码如下: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
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中断您的程序,您应该将其添加到这两个选项中。