【问题标题】:Can't kill a python process in sublime text 2无法在 sublime text 2 中杀死 python 进程
【发布时间】:2013-11-03 23:30:26
【问题描述】:

我搜索了很多地方,但我似乎无法找到正确的关键字。我在 Sublime 中的 Python 中有一个停滞过程,导致 Mac 上的死亡沙滩球。我无法访问“工具”>“取消构建”按钮,并且 Control + C 不起作用。我如何杀死这个进程?

【问题讨论】:

  • 当您找到解决方案时,您可以添加语法错误并再次运行程序,使其自动停止。

标签: sublimetext2


【解决方案1】:

我还没有找到在不杀死所有 Sublime 的情况下杀死 Sublime 中的进程的方法。但是我确实找到了一种方法来减少杀死和重新打开 Sublime 的痛苦。这是我的方式。

  1. Command-option-escape:这会打开强制退出窗口。
  2. 强制退出窗口会询问你是否真的要退出 Sublime 两次。只需按两次输入。
  3. 崩溃报告窗口将打开。我讨厌这个窗口,因为它漂浮在一切之上,所以你不能忽视它,关闭它让我做额外的击键,所以我disabled it.
  4. 重新打开崇高。当 Sublime 重新打开时,它会打开您在崩溃之前打开的所有文件,带您回到原来的位置。

许多人认为重新打开 Sublime 很麻烦,因为他们必须用鼠标导航到应用程序目录,这个过程大约需要 10 到 30 秒。我以前觉得这很烦人,所以我设置了它,以便我可以用五次击键重新打开 sublime,大约需要三秒钟。

首先,我安装了Alfred。在这种情况下,您只需要 Alfred 的免费版本。

安装 Alfred 后,执行以下操作:

  1. option-spacebar 调出 Alfred 搜索栏。 Alfred 很像您计算机上的 Google 搜索。
  2. 输入字母“su”。在 Alfred 搜索栏下方,出现了一堆选项,第一个选项是 Sublime Text 2。Alfred 会自动突出显示其搜索结果列表中的第一件事,因此当您按 Enter 时,它将启动突出显示的应用程序。
  3. 按回车键。 Alfred 打开 Sublime。瞧:Sublime 回到了你运行脚本之前的样子。

因此,总的来说,一旦我启动了一个冻结 Sublime 的进程,我会执行以下 10 次击键:

cmd-option-escape enter enter option-spacebar s u enter

此过程确实使“强制退出应用程序”窗口悬而未决,因为我还没有找到一种快速的方法来摆脱它,而无需在我的系统中添加十次额外的击键。如果它真的困扰我,我点击窗口并执行 cmd-w,它会关闭窗口。

另一个烦人的事情是 Sublime 需要几秒钟才能重新启动,所以通常我不会费心在 Sublime 中运行。相反,我转到终端并在那里运行东西,这样我就可以在不影响 Sublime 的情况下按 Ctrl-C 来测试我正在测试的脚本。

此外,“工具”>“取消构建”选项还有一个键盘快捷键。我从未使用过它,但在this forum post. 中讨论了使用它并解决它的问题

【讨论】:

  • 感谢您的详细回复,尽管我希望类似于 control+c 在终端中所做的事情。至少我不是唯一一个认为这是个问题的人。
  • 我在显示屏右下角保持打开“强制退出应用程序”。它从 Tara 的解决方案中删除了一步(命令转义),并且在 Sublime 的右下角很少有任何代码。
【解决方案2】:

此答案特定于 python 和 windows。我不确定是否有 mac 等效项。

可以从任务管理器终止正在运行的 python 脚本。使用Ctrl+Shift+esc 打开任务管理器。转到processes 选项卡并通过简单地敲击del 来杀死python.exe。这只会终止脚本并保持 sublime 不变。

【讨论】:

  • 对于 OS X,您可以转到活动监视器并找到进程“python”并强制退出该进程。请注意,这样做会杀死我相信的所有 python 进程。
【解决方案3】:

我找到了一个有趣的方法来解决这个问题。

我在 sublime-text2 上的构建系统调用我的 Makefile,它有 2 个选项并使用 ONESHELL 指令:

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

请注意,在它启动我的程序后,它的 pid 会保存在一个文件中。 我还有第二个选择:

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

此选项会终止由run 命令启动的进程。

然后我配置了我的构建系统(工具 -> 构建系统 -> 新构建系统...),所以我可以访问这两个选项:

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

}

但我想从 sublime 上的键绑定中调用这两个选项,所以我编辑了文件“首选项-> 键绑定-用户”,如下所示:

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

现在,如果我按 ctrl+r,我的程序将启动(并进入无限循环),当我按 alt+r 时,我的程序将停止,这几乎是我想要的。

剩下的唯一问题是当我运行 alt+r 时,我会丢失 ctrl+r 产生的输出。

编辑: 我发现的其他方法是在 Makefile 上的新 xterm 进程上启动我的程序:

run:
    xterm ./myprogram

我可以用 ctrl+c 关闭它,它不会停止 sublime 的工作。

【讨论】:

    【解决方案4】:

    我已将 VGarcia 的解决方案“移植”到 Python。但是,如果您的项目无论如何都需要 Makefile,您可能应该使用 Makefile 方法。

    VGarcia 解决方案备注:

    • VGarcia 的解决方案对我来说效果很好,但我必须在一行中写上./myprogram & echo $$! > "pid.tmp",否则存储的 PID 最终会为空。

    • 我想在运行之前构建二进制文件,所以我只添加了一个构建目标 myprogram 并保留了依赖关系 run: myprogram

    (我知道这应该是评论,但我没有足够的声誉。我会尽可能地发表评论。)

    Python 版本

    编写一个run.py脚本来运行程序并存储进程的PID(见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))
    

    编写一个stop.py脚本来读取PID并杀死进程:

    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"],
            }
        ]
    }
    

    或者您可以将所有函数放在一个模块中,并通过解析main()中的一些参数来调用不同的方法runstop

    改进建议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 方法作为 shell 脚本来执行此操作。无论如何,请务必选择一种您觉得自在的语言。

    【讨论】:

      【解决方案5】:

      启动任务管理器或计算机上的任何进程管理器(如果没有,请获取一个)。删除对应的python.exe和pythonw.exe进程

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,我只需要在我的程序中处理来自 Sublime Text 的 SIGTERM 信号。

        import sys, signal
        
        def signal_handler(signal, frame):
            sys.exit(0)
        
        signal.signal(signal.SIGTERM, signal_handler)
        

        还有一个与此相关的错误,如果您在旧版本仍在运行时启动新版本,它只会在您向终端打印内容时终止进程:https://github.com/SublimeTextIssues/Core/issues/1049

        【讨论】:

          【解决方案7】:

          此页面上的所有答案都没有真正适合我。
          可悲的事实似乎是没有“文明”的方式来杀死从 sublime 开始的 python 脚本(CTRL/COMMAND + B)。

          【讨论】:

            【解决方案8】:

            如果你是mac或者linux用户,可以通过killall命令杀死所有python进程。

            killall -9 Python
            

            快速访问

            您可以稍后将别名添加到 bash_profile 脚本并通过调用 killpython 来运行相同的代码。

            nano ~/.bash_profile
            

            将此行添加为别名。

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

            保存并重新加载脚本。

            source ~/.bash_profile
            

            完成。

            【讨论】:

              【解决方案9】:

              在 SublimeText3 中,工具 > 取消构建有一个键盘快捷键:^C。如果在构建日志中单击向下,然后输入 control+C,它将停止构建并显示消息[Cancelled]

              【讨论】:

              • 程序不会停止,我试过了:(((。看看任务管理器
              猜你喜欢
              • 1970-01-01
              • 2021-01-07
              • 2010-12-08
              • 2013-08-05
              • 2015-06-08
              • 2015-06-01
              • 2016-07-13
              • 1970-01-01
              • 2015-01-06
              相关资源
              最近更新 更多