2015-10-12 19 views
7

Xin chào tôi có một tập lệnh trong python chạy trong một vòng lặp vô hạn một số hành động, nhưng đôi khi tôi phải đóng tập lệnh và cập nhật nó bằng phiên bản mới, thực hiện một số công việc trong máy chủ, v.v.Hành động trước khi đóng kịch bản python

câu hỏi đặt ra là làm thế nào tôi có thể làm gì để ngăn chặn kịch bản và trước khi đóng cửa nó, kịch bản thực hiện một số hành động sau khi vòng lặp càng gần kết nối sqlite, kết nối chặt chẽ với một nhà môi giới vv

những gì tôi làm bây giờ là ctr + c cho đến khi dừng (mất vài lần trước khi kết thúc) và sau đó đóng thủ công kết nối sqlite, v.v.

+2

Bạn có thể sử dụng [trình quản lý ngữ cảnh] (https://www.python.org/dev/peps/pep-0343/) và dọn dẹp trong '__exit__' hoặc có' except KeyboardInterrupt' hoặc 'finally' trên 'try'. – jonrsharpe

Trả lời

7

Bạn có thể nhận tín hiệu exe dễ thương một cái gì đó khác sau đó sys.exit

import signal 
import sys 

def signal_handler(signal, frame): 
    print 'You pressed Ctrl+C - or killed me with -2' 
    #.... Put your logic here ..... 
    sys.exit(0) 

signal.signal(signal.SIGINT, signal_handler) 
+0

Điều này làm việc hoàn hảo với tôi. Bất kỳ khả năng để bắt khi thiết bị đầu cuối đóng cửa quá? –

+0

Bạn có thể cần phải eplore tín hiệu 'SIGHUP' - điều này về cơ bản là tín hiệu được gửi đến các quá trình khi thiết bị đầu cuối ngắt kết nối. – Vor

0

Bạn có thể sử dụng một khối try-except xung quanh vòng lặp của bạn và bắt KeyboardInterrupt ngoại lệ. Hoặc một khối finally cũng sẽ dọn sạch nếu chương trình chấm dứt theo kiểu có trật tự. Mã của bạn sẽ trông giống như sau:

try: 
    <your loop goes here> 
except KeyboardInterrupt: 
    <handle error and do possible special cleanup> 
finally: 
    <do the cleanup that always has to happen> 

Lưu ý rằng cách này bạn chỉ xử lý trường hợp khi bạn giết tập lệnh bằng bàn phím và không có trường hợp nào khác.

Bạn cũng có thể sử dụng các with tuyên bố see here for more info (như đã đề cập trong các ý kiến)

0
import sys 
try: 
    # Program here 
except KeyboardInterrupt: 
    # Close connections 
    sys.exit(0) 
+1

Vui lòng xem xét chỉnh sửa bài đăng của bạn để thêm giải thích thêm về mã của bạn làm gì và tại sao nó sẽ giải quyết vấn đề. Một câu trả lời mà hầu hết chỉ chứa mã (ngay cả khi nó hoạt động) thường không giúp OP hiểu được vấn đề của họ. – SuperBiasedMan

2

Bạn có thể sử dụng atexit mô-đun:

import atexit 

def cleanup(): 
    print "cleanup" 
    # close connections, ... 

atexit.register(cleanup) 

Chức năng cleanup() sẽ được gọi trên mỗi chấm dứt bình thường (điều này bao gồm Ctrl-C).

Các vấn đề liên quan