无法在Sublime Text 2中杀死Python进程

9

我在很多地方搜索,但似乎无法正确获取关键字。我在Sublime中使用Python时出现了一个停滞的进程,在Mac上导致了“死亡的沙滩球”。我无法访问“工具”>“取消构建”按钮,也不能使用Control + C。我该如何终止这个进程?


在你找到解决方案的过程中,你可以添加一个语法错误并再次运行程序,这样它就会自动停止。 - rassa45
9个回答

13

我还没有找到在Sublime中杀死一个进程而不关闭整个Sublime的方法。但是我找到了一种使关闭和重新打开Sublime变得更加轻松的方法。以下是我的做法。

  1. Command-option-escape:这会弹出强制退出窗口。
  2. 强制退出窗口会问你是否真的要退出Sublime两次。只需按两次回车即可。
  3. 崩溃报告窗口将会打开。我讨厌这个窗口,因为它浮在所有窗口之上,所以你无法忽略它,而关闭它需要额外的按键操作,所以我禁用了它
  4. 重新打开Sublime。当Sublime重新打开时,它会打开你在崩溃之前打开的所有文件,带你回到原来的位置。
许多人认为重新打开Sublime很麻烦,因为他们必须用鼠标导航到应用程序目录,这个过程大约需要10-30秒钟。我曾经也觉得这很烦人,所以我设置了一下,只需5个按键就可以重新打开sublime,而且只需要3秒钟。
首先,我安装了Alfred。在这种情况下,您只需要免费版本的Alfred。
安装了Alfred后,请执行以下操作:
  1. 按option-spacebar键会弹出Alfred搜索栏。 Alfred很像计算机上的Google搜索。
  2. 输入字母“su”。在Alfred搜索栏下面,会出现一堆选项,第一个选项是Sublime Text 2。 Alfred自动突出显示它的搜索结果列表中的第一件事物,因此当您按Enter键时,它将启动突出显示的应用程序。
  3. 按Enter键。 Alfred打开Sublime。 Voila:Sublime回到运行脚本之前的状态。
因此,在总体上,一旦我开始一个冻结Sublime的过程,我就会做出以下10个按键:

命令-选项-逃脱回车回车 选项-空格 s u 回车

这个过程会留下“强制退出应用程序”窗口,因为我没有找到一个快速的方法来除掉它而不需要在系统中添加十个额外的按键。如果真的让我很烦恼,我会点击这个窗口并做cmd-w,这样就可以关闭这个窗口。

另一个让人烦恼的事情是Sublime需要几秒钟才能重新启动,所以通常我不费力地从Sublime中运行东西。相反,我会去终端并在那里运行东西,这样我就可以Ctrl-C测试脚本而不影响Sublime。

此外,还有一个工具的键盘快捷键:Tools > Cancel Build。我从未使用过它,但使用它并解决问题已经在这篇论坛帖子中讨论过。


谢谢详细的回复,尽管我希望得到类似于终端中控制+c所做的事情。至少我不是唯一认为这是个问题的人。 - user2483724
我把“强制退出应用程序”保持在显示器右下角。这样可以省去 Tara 的解决方案中的一个步骤(command-escape),而且 Sublime 最右下角很少有任何代码。 - Jack

6

本答案仅适用于Python和Windows。我不确定是否有Mac的等效方法。

运行中的Python脚本可以从任务管理器中终止。使用Ctrl + Shift + esc打开任务管理器。转到进程选项卡,通过简单地按下del来终止python.exe。这只会终止脚本并保持sublime不受影响。


对于OS X,您可以进入活动监视器并找到进程“python”,然后强制停止该进程。请注意,这样做将终止所有Python进程。 - Zizouz212

2

我找到了一种有趣的解决方法。

我的Sublime Text 2中的构建系统会调用我的Makefile,该文件有两个选项并使用ONESHELL指令:

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

请注意,当我的程序启动后,它的进程ID会保存在一个文件中。我还有第二个选项:
stop:
    kill -9 `cat pid.tmp`
    rm pid.tmp

这个选项可以终止由run命令启动的进程。

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

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

但我希望可以通过sublime中的快捷键调用这两个选项,因此我编辑了"Preferences -> Key Bindings - User"文件,使其如下所示:

[
{ "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的工作。


1
我已经将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脚本执行此操作。 无论如何,请确保选择自己熟悉的语言。

0

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

import sys, signal

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

signal.signal(signal.SIGTERM, signal_handler)

这个问题还与一个 bug 相关,如果在旧版仍在运行时启动新版,则只有在向终端打印内容时,它才会终止该进程:https://github.com/SublimeTextIssues/Core/issues/1049


0

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


0

这一页上没有任何答案对我有用。
可悲的事实似乎是,没有什么“文明”的方式可以杀死在sublime上启动的Python脚本(CTRL/COMMAND + B)。


-1

如果您是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

完成。


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

1
程序不会停止,我试过了 :(((。看一下任务管理器。 - rassa45

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接