[英]How to capture ctrl-c for killing a Flask python script
我有以下腳本,該腳本僅引導服務於動態創建網站的Web服務器。 為了獲取動態數據,腳本打開了一個文件來讀取數據。
我擔心的是如何捕獲CTRL-C命令來殺死python腳本,以便在殺死腳本線程之前關閉文件。
我嘗試了以下幾件事,但均無濟於事:
from flask import Flask, render_template
import time
# Initialize the Flask application
app = Flask(__name__)
fileNames = {}
fileDesc = {}
for idx in range(1,4):
fileNames["name{}".format(idx)] = "./name" + str(idx) + ".txt"
fileDesc["name{}".format(idx)] = open(fileNames["name{}".format(idx)],'r')
try:
@app.route('/')
def index():
# code for reading data from files
return render_template('index.html', var1 = var1)
@app.errorhandler(Exception)
def all_exception_handler(error):
print("Closing")
for key, value in fileDesc:
val.close()
print("Files closed")
if __name__ == '__main__':
app.run(
host="192.168.0.166",
port=int("8080"),
debug=True
)
except KeyboardInterrupt:
print("Closing")
for key, value in fileDesc:
val.close()
print("Files closed")
提前致謝。
我在項目中也遇到了同樣的問題。 對我有用的東西是使用signal
捕獲CTRL-C。
import sys
import signal
def handler(signal, frame):
print('CTRL-C pressed!')
sys.exit(0)
signal.signal(signal.SIGINT, handler)
signal.pause()
將這段代碼放入運行Flask應用程序的腳本中后,即可捕獲CTRL-C。 到目前為止,您必須使用CTRL-C兩次,然后執行該處理程序。 如果發現新內容,我將作進一步調查並編輯答案。
編輯1
好的,我已經做了更多的研究,並提出了其他一些方法,因為上述方法非常實用。
在生產中,清理代碼(如關閉數據庫或文件)是通過@app.teardown_appcontext
裝飾器完成的。 請參閱本教程的這一部分 。
使用簡單服務器時,可以通過公開werkzeug關閉功能來關閉它。 看到這篇文章 。
編輯2
我已經測試了Werkzeug關閉功能,它還與teardown_appcontext
功能一起使用。 因此,我建議使用裝飾器編寫拆解函數,並編寫一個簡單的函數來關閉werkzeug服務器。 這樣,生產代碼和開發代碼是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.