簡體   English   中英

如何捕獲ctrl-c以殺死Flask python腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM