无法在崇高文本2中杀死python进程

时间:2013-11-03 23:30:26

标签: sublimetext2

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

9 个答案:

答案 0 :(得分:13)

我没有找到一种方法来杀死Sublime中的进程而不会杀死所有Sublime。但我确实找到了一种杀死和重新开启Sublime的方法,而不是那么痛苦。这是我的方式。

  1. Command-option-escape:这会打开强制退出窗口。
  2. 强制退出窗口会询问您是否确实要退出Sublime两次。只需输入两次。
  3. 将打开崩溃记者窗口。我讨厌这个窗口,因为它漂浮在所有东西之上,所以你不能忽视它,关闭它让我做了额外的击键,所以我disabled it.
  4. 重新开启崇高。当Sublime重新打开时,它会打开崩溃前打开的所有文件,将您带回到原来的位置。
  5. 许多人认为重新开启Sublime很痛苦,因为他们必须使用鼠标导航到应用程序目录,这个过程大约需要10到30秒。我曾经发现这很烦人,所以我设置它以便我可以用五次击键重新打开崇高,这需要我大约三秒钟。

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

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

    1. 选项空格键显示Alfred搜索栏。 Alfred很像Google搜索您的计算机。
    2. 输入字母“su”。在Alfred搜索栏下方,会出现一系列选项,第一个选项是Sublime Text 2.Alfred会自动突出显示搜索结果列表中的第一个内容,这样当您按Enter键时,它将启动突出显示的应用程序。
    3. 点击进入。阿尔弗雷德打开了Sublime。 Voila:Sublime回归到你运行脚本之前的状态。
    4. 所以,总的来说,一旦我开始冻结Sublime的进程,我会做以下10次击键:

      Cmd-option-escape输入enter-spacebar s u enter

      这个程序确实让强制退出应用程序窗口处于闲置状态,因为我没有找到一种快速的方法来摆脱它而不向我的系统添加十次额外的击键。如果它真的让我感到烦恼,我点击窗口并执行cmd-w,关闭窗口。

      另一个令人讨厌的事情是Sublime重新启动需要几秒钟,所以通常我都不会在Sublime中运行东西。相反,我转到终端并在那里运行,以便我可以Ctrl-C我正在测试的脚本而不会影响Sublime。

      此外,还有一个工具>键盘快捷键。取消构建选项。我从未使用它,但在this forum post.

      中讨论了使用它并解决问题

答案 1 :(得分:5)

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

可以从任务管理器终止正在运行的python脚本。使用Ctrl+Shift+esc打开任务管理器。转到processes标签,只需按下python.exe即可终止del。这只会终止脚本并保持不变的崇高。

答案 2 :(得分:2)

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

我在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上的键绑定调用这两个选项,所以我编辑了文件" Preferences - >关键绑定 - 用户"看起来像这样:

[
{ "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关闭它,它不会停止工作的崇高。

答案 3 :(得分: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"],
        }
    ]
}

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

改进建议1 (未尝试过自己)

您可能希望将脚本重用于不同的项目。在这种情况下:

  1. 将脚本更改为带参数的函数。您可能至少需要def run(bin_path)。将脚本放在可以从任何项目轻松访问的位置。

  2. 在您的sublime项目中,将构建配置放在build_systems条目中(值是一个列表,请参阅https://www.sublimetext.com/docs/2/projects.html,有点旧但可用)。您可以使用"cmd": ["python", "-c", "from script import run; run(bin_path)"]直接调用这些函数,也可以按照上面的建议使用main()

  3. 改进建议2 (未尝试过自己)

    如果您同时通过多个进程运行程序(意外地或测试某些网络功能),stop过程将只会终止最后一个进程。您可以调整算法以在临时文件中存储多个PID,然后相应地终止每个进程。

    您也可以使用Makefile方法作为shell脚本执行此操作。无论如何,一定要选择一种你觉得放心的语言。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我有同样的问题,我只需要处理来自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

答案 6 :(得分:0)

此页面上的答案均未对我真正起作用。
可悲的事实似乎是,没有一种“ 文明的”方式杀死以崇高的方式启动的python脚本( CTRL / COMMAND + B )。

答案 7 :(得分:-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

完成。

答案 8 :(得分:-2)

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