2

優れたBottle Web フレームワークを小さなアプリケーション (最初のターゲットは Windows OS)に組み込みたいと考えています。このアプリは、subprocess モジュールのおかげでボトル Web サーバーを開始します。

import subprocess
p = subprocess.Popen('python websrv.py')

ボトルアプリは非常にシンプルです

@route("/")
def index():
    return template('index')

run(reloader=True)

デフォルトの Web サーバーを Windows コンソールで起動します。

Ctrl-C を押してボトル Web サーバーを閉じる必要があることを除けば、すべて問題ないようです。シャットダウン時にマスターアプリがウェブサーバーを終了することを望みます。それを行う方法が見つかりません(残念ながら、この場合 p.terminate() は機能しません)

何か案が?

前もって感謝します

4

4 に答える 4

4

リロード中のサーバーをシャットダウンするには、次の 2 つの方法があります。

1) p を (os.kill(p.pid)またはを使用して) 終了しp.terminate()、「websrv.py」の変更時刻 ( os.utime('websrv.py')) を変更して、子プロセスの自動シャットダウンをトリガーします。

os.kill(p.pid, signal.SIGINT)2) シャットダウンと同じp を終了しますCtrl-C

于 2010-04-15T14:47:27.653 に答える
1

ボトルがリロードモードの場合、終了プロセスが機能しないようです。この場合、それ自体がサブプロセスを開始します。

リロードがFalseに設定されている場合、終了は正常に機能しているようです。

于 2010-04-15T10:02:21.927 に答える
1

0.8.1 以降、リロード サーバーは孤立したプロセスをクリーンアップするのに十分なほどスマートです。サーバーを終了するには、いくつかの方法があります。

  • 親プロセスにヒットCtrl-Cまたは送信します。SIGINT(おすすめされた)
  • 親プロセスを強制終了します。子供は 2 秒以内に優雅に死亡します。
  • 子プロセスまたは sys.exit() を 3 以外のステータス コードで強制終了します。親プロセスはすぐに終了します。
于 2010-07-30T13:41:35.480 に答える
0

ボトルはサブプロセスでリクエストを実行しているように見えるため、リクエスト内からボトルサーバーを閉じるのに問題がありました。

最終的に、解決策は次のことであることがわかりました。

sys.stderr.close()

リクエスト内(ボトルサーバーに渡され、それを斧した)。

プロセスでそれを試して、ボトルがメッセージを受け取るかどうかを確認してください。

于 2012-07-15T02:45:40.283 に答える