9

いろいろなところを検索しましたが、キーワードを正しく取得できないようです。Mac で死のビーチボールを引き起こす Sublime の Python で停止プロセスがあります。[ツール] > [ビルドのキャンセル] ボタンにアクセスできず、Control + C が機能しません。このプロセスを強制終了するにはどうすればよいですか?

4

9 に答える 9

13

Sublime のすべてを強制終了せずに Sublime のプロセスを強制終了する方法を見つけられませんでした。しかし、サブライムを殺して再開する際の苦痛を軽減する方法を見つけました。これが私のやり方です。

  1. Command-option-escape: 強制終了ウィンドウが表示されます。
  2. 強制終了ウィンドウで、Sublime を本当に 2 回終了するかどうかを尋ねられます。Enter キーを 2 回押すだけです。
  3. クラッシュ レポーター ウィンドウが開きます。私はこのウィンドウが嫌いでした。なぜなら、このウィンドウはすべての上に浮かんでいて無視できないからです。また、ウィンドウを閉じると余分なキーストロークが必要になるため、無効にしました。
  4. 崇高を再開します。Sublime が再度開くと、クラッシュする前に開いていたすべてのファイルが開き、元の場所に戻ります。

Sublime を再度開くのは、マウスでアプリケーション ディレクトリに移動する必要があり、このプロセスには約 10 ~ 30 秒かかるため、多くの人が苦痛だと考えています。以前はこれが面倒だと思っていたので、5 回のキーストロークで Sublime を再度開くことができるように設定しました。約 3 秒かかります。

まずはアルフレッドをインストール。この場合、Alfred の無料バージョンのみが必要です。

Alfred をインストールしたら、次の手順を実行します。

  1. option-spacebar で Alfred 検索バーが表示されます。Alfred は、コンピュータの Google 検索によく似ています。
  2. 「す」と入力します。Alfred 検索バーの下に一連のオプションが表示され、最初のオプションは Sublime Text 2 です。Alfred は検索結果のリストの最初のものを自動的に強調表示するため、Enter キーを押すと、強調表示されたアプリケーションが起動します。
  3. エンターを押します。アルフレッドはサブライムを開きます。出来上がり: Sublime は、スクリプトを実行する前の状態に戻りました。

したがって、Sublime をフリーズさせるプロセスを開始すると、合計で次の 10 回のキーストロークを実行します。

Cmd-option-escape エンター エンター オプション-スペースバー su エンター

システムに 10 回の余分なキーストロークを追加せずにそれを取り除く簡単な方法を見つけられなかったため、この手順では [アプリケーションの強制終了] ウィンドウがそのまま残ります。本当に気になる場合は、ウィンドウをクリックして cmd-w を実行し、ウィンドウを閉じます。

もう 1 つの厄介な点は、Sublime が再起動するのに数秒かかることです。そのため、通常、Sublime 内から実行することは気にしません。代わりに、Sublime に影響を与えずにテストしているスクリプトを Ctrl-C できるように、ターミナルに移動してそこで実行します。

さらに、[ツール] > [ビルドのキャンセル] オプションのキーボード ショートカットがあります。私はそれを使用したことはありませんが、使用して問題を解決することについては、このフォーラムの投稿で議論されています。

于 2013-11-28T14:48:52.403 に答える
6

この回答は、python と Windows に固有のものです。Macに相当するものがあるかどうかはわかりません。

実行中の Python スクリプトは、タスク マネージャーから終了できます。を使用Ctrl+Shift+escして、タスク マネージャーを開きます。processesタブに移動し、python.exeを押すだけでキルできdelます。これはスクリプトを終了させるだけで、Sublime はそのまま残ります。

于 2014-07-03T09:33:10.387 に答える
2

これを解決する興味深い方法を見つけました。

sublime-text2 上のビルド システムは、2 つのオプションがあり、ONESHELL ディレクティブを使用する Makefile を呼び出します。

.ONESHELL:
run: myprogram
    ./myprogram &
    echo $$! > "pid.tmp"

私のプログラムを起動した後、その pid がファイルに保存されることに注意してください。そして、私には2番目のオプションがあります:

stop:
    kill -9 `cat pid.tmp`
    rm pid.tmp

このオプションは、runコマンドによって開始されたプロセスを強制終了します。

次に、ビルド システム (ツール -> ビルド システム -> 新しいビルド システム...) を構成して、両方のオプションにアクセスできるようにしました。

{
    "cmd": ["make"],
    "variants":
    [
            {
                    "name": "Run",
                    "cmd": ["make", "run"]
            },
            {
                    "name": "Stop",
                    "cmd": ["make", "stop"]
            }
    ]

}

しかし、崇高なキーバインディングから両方のオプションを呼び出したいので、ファイル「設定->キーバインディング-ユーザー」を次のように編集しました。

[
{ "keys": ["ctrl+r"], "command": "build", "args": {"variant": "Run"} },
{ "keys": ["alt+r"], "command": "build", "args": {"variant": "Stop"} }
]

ctrl+r を押すとプログラムが起動し (そして無限ループに入ります)、alt+r を押すとプログラムが停止します。

残っている唯一の問題は、alt + ri を実行すると、ctrl + r によって生成された出力が失われることです。

編集: 私が見つけた他の方法は、Makefile の新しい xterm プロセスでプログラムを開始することでした:

run:
    xterm ./myprogram

ctrl+c で閉じることができ、Sublime の動作が停止することはありません。

于 2014-03-27T03:10:52.337 に答える
1

VGarcia のソリューションを Python に「移植」しました。ただし、プロジェクトに Makefile が必要な場合は、おそらく Makefile メソッドを使用する必要があります。

Vガルシアのソリューションに関するコメント:

  • VGarcia のソリューションはうまく機能しましたが./myprogram & echo $$! > "pid.tmp"、1 行で記述しなければなりませんでした。そうしないと、格納された PID が空になってしまいます。

  • 実行する前にバイナリをビルドしたかったので、ビルドターゲットを追加しmyprogramて依存関係を維持しましたrun: myprogram

(これがコメントであることはわかっていますが、それについて十分な評判がありませんでした。できるときにコメントにします。)

Python バージョン

プログラムを実行し、プロセスの PID を保存する run.py スクリプトを作成します ( https://docs.python.org/2/library/subprocess.html#subprocess.Popenを参照)。

from subprocess import Popen  # prefer subprocess32 in Python 2 for Linux / OS X

# run process as child (still receive process output)
pid = Popen(['build/myprogram']).pid

# store pid
with open('pid.tmp', 'w') as f:
    f.write(str(pid))

PID を読み取ってプロセスを強制終了する stop.py スクリプトを作成します。

import os, signal
from subprocess import Popen

# read PID
with open('pid.tmp', 'r') as f:
    pid = f.readline().rstrip()

# kill process
os.kill(int(pid), signal.SIGKILL)

# remove temp file
os.remove('pid.tmp')

ビルドを構成します。

{
    "name": "Python Build",
    // adapt for your project
    "cmd": [my_build_cmd],
    "working_dir": "$project_path",
    "variants":
    [
        {
            "name": "Run",
            "cmd": ["python", "run.py"], 
        },
        {
             "name": "Stop",
             "cmd": ["python", "stop.py"],
        }
    ]
}

または、すべての関数を 1 つのモジュールに配置し、さまざまなメソッドを呼び出して、runいくつstopかの引数を解析することもできますmain()

改善提案1(自分では試していません)

さまざまなプロジェクトでスクリプトを再利用したい場合があります。この場合:

  1. スクリプトをパラメーター付きの関数に変更します。おそらく、少なくともdef run(bin_path). どのプロジェクトからでも簡単にアクセスできる場所にスクリプトを配置します。

  2. sublime-project で、ビルド構成をbuild_systemsエントリに入力します (値はリストです。https://www.sublimetext.com/docs/2/projects.htmlを参照してください。少し古いですが使用可能です)。関数を直接呼び出すか、上記のように"cmd": ["python", "-c", "from script import run; run(bin_path)"]使用することができます。main()

改善提案2(自分では試していません)

一度に複数のプロセスでプログラムを実行すると (誤って、またはネットワーク機能をテストするために)、stop手順は最後のプロセスのみを強制終了します。複数の PID を一時ファイルに保存するようにアルゴリズムを調整し、それに応じて各プロセスを強制終了できます。

これは、シェル スクリプトとして Makefile メソッドを使用して行うこともできます。いずれにせよ、あなたが安心できる言語を選ぶようにしてください。

于 2015-02-13T14:10:10.400 に答える
-1

Mac または Linux ユーザーの場合、すべての python プロセスをkillallコマンドで強制終了できます。

killall -9 Python

迅速なアクセス

後で bash_profile スクリプトにエイリアスとして追加し、 を呼び出して同じコードを実行できますkillpython

nano ~/.bash_profile

この行をエイリアスとして追加します。

alias killpython='killall -9 Python; echo "killed all snakes ";

保存してスクリプトをリロードします。

source ~/.bash_profile

終わり。

于 2020-08-14T18:46:54.267 に答える