我在很多地方搜索过,但我似乎无法获得正确的关键字。我在 Sublime 中的 Python 中有一个停滞过程,导致 Mac 上的死亡沙滩球。我无法访问“工具”>“取消构建”按钮,并且 Control + C 不起作用。我如何杀死这个进程?
9 回答
我还没有找到在不杀死所有 Sublime 的情况下杀死 Sublime 中的进程的方法。但是我确实找到了一种方法来减少杀死和重新打开 Sublime 的痛苦。这是我的方式。
- Command-option-escape:这会打开强制退出窗口。
- 强制退出窗口会询问你是否真的要退出 Sublime 两次。只需按两次输入。
- 崩溃报告窗口将打开。我讨厌这个窗口,因为它漂浮在一切之上,所以你不能忽略它,关闭它会让我做额外的击键,所以我禁用了它。
- 重新打开崇高。当 Sublime 重新打开时,它会打开您在崩溃之前打开的所有文件,将您带回到原来的位置。
许多人认为重新打开 Sublime 很麻烦,因为他们必须用鼠标导航到应用程序目录,这个过程大约需要 10 到 30 秒。我以前觉得这很烦人,所以我设置了它,以便我可以用五次击键重新打开 sublime,大约需要三秒钟。
首先,我安装了Alfred。在这种情况下,您只需要 Alfred 的免费版本。
安装 Alfred 后,执行以下操作:
- option-spacebar 调出 Alfred 搜索栏。Alfred 很像您计算机上的 Google 搜索。
- 输入字母“su”。在 Alfred 搜索栏下方,出现了一堆选项,第一个选项是 Sublime Text 2。Alfred 会自动突出显示搜索结果列表中的第一件事,因此当您按 Enter 时,它将启动突出显示的应用程序。
- 点击进入。Alfred 打开 Sublime。瞧:Sublime 回到了你运行脚本之前的样子。
因此,总的来说,一旦我启动了一个冻结 Sublime 的进程,我会执行以下 10 次击键操作:
Cmd-option-escape enter 输入 option-空格键 su enter
此过程确实使“强制退出应用程序”窗口悬而未决,因为我还没有找到一种快速的方法来摆脱它,而无需在我的系统中添加十次额外的击键。如果它真的困扰我,我点击窗口并执行 cmd-w,它会关闭窗口。
另一个烦人的事情是 Sublime 需要几秒钟才能重新启动,所以通常我不会费心在 Sublime 中运行东西。相反,我转到终端并在那里运行东西,这样我就可以 Ctrl-C 正在测试的脚本而不影响 Sublime。
此外,“工具”>“取消构建”选项还有一个键盘快捷键。我从未使用过它,但在此论坛帖子中讨论了使用它并解决它的问题。
这个答案是特定于 python 和 windows 的。我不确定是否有 mac 等价物。
可以从任务管理器中终止正在运行的 python 脚本。用于Ctrl+Shift+esc
打开任务管理器。转到processes
选项卡并python.exe
通过简单的 pessing杀死del
。这只会终止脚本并保持崇高不变。
我找到了一个有趣的方法来解决这个问题。
我在 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+ri 时,ctrl+r 产生的输出会丢失。
编辑:我发现的其他方法是在 Makefile 上的新 xterm 进程上启动我的程序:
run:
xterm ./myprogram
我可以用 ctrl+c 关闭它,它不会停止 sublime 的工作。
我已将 VGarcia 的解决方案“移植”到 Python。但是,如果您的项目无论如何都需要 Makefile,您可能应该使用 Makefile 方法。
关于 VGArcia 解决方案的备注:
VGarcia 的解决方案对我来说效果很好,但我必须写
./myprogram & echo $$! > "pid.tmp"
在一行上,否则存储的 PID 将最终为空。我想在运行之前构建二进制文件,所以我只是添加了一个构建目标
myprogram
并保留了依赖项run: myprogram
(我知道这应该是评论,但我没有足够的声誉。我会尽可能地发表评论。)
蟒蛇版本
编写一个 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
并stop
通过解析main()
.
改进建议1(自己没试过)
您可能希望将脚本重用于不同的项目。在这种情况下:
将脚本更改为带参数的函数。您可能至少想要
def run(bin_path)
. 将脚本放在您可以从任何项目轻松访问的地方。在您的 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 脚本来执行此操作。无论如何,一定要选择一种你觉得轻松的语言。
启动任务管理器或您计算机上的任何进程管理器(如果没有,请获得一个)。删除对应的python.exe和pythonw.exe进程
我有同样的问题,我只需要在我的程序中处理来自 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
这个页面上的答案都没有真正对我有用。
可悲的事实似乎是没有“文明”的方式来杀死从 sublime ( CTRL/COMMAND + B) 开始的 python 脚本。
如果你是 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
完毕。
在 SublimeText3 中,Tools > Cancel Build: 有一个键盘快捷键^C
。如果您在构建日志中单击向下,然后输入 control+C,它将停止构建并显示消息[Cancelled]
。