我在很多地方搜索,但似乎无法正确获取关键字。我在Sublime中使用Python时出现了一个停滞的进程,在Mac上导致了“死亡的沙滩球”。我无法访问“工具”>“取消构建”按钮,也不能使用Control + C。我该如何终止这个进程?
我在很多地方搜索,但似乎无法正确获取关键字。我在Sublime中使用Python时出现了一个停滞的进程,在Mac上导致了“死亡的沙滩球”。我无法访问“工具”>“取消构建”按钮,也不能使用Control + C。我该如何终止这个进程?
我还没有找到在Sublime中杀死一个进程而不关闭整个Sublime的方法。但是我找到了一种使关闭和重新打开Sublime变得更加轻松的方法。以下是我的做法。
命令-选项-逃脱回车回车 选项-空格 s u 回车
这个过程会留下“强制退出应用程序”窗口,因为我没有找到一个快速的方法来除掉它而不需要在系统中添加十个额外的按键。如果真的让我很烦恼,我会点击这个窗口并做cmd-w,这样就可以关闭这个窗口。
另一个让人烦恼的事情是Sublime需要几秒钟才能重新启动,所以通常我不费力地从Sublime中运行东西。相反,我会去终端并在那里运行东西,这样我就可以Ctrl-C测试脚本而不影响Sublime。
此外,还有一个工具的键盘快捷键:Tools > Cancel Build。我从未使用过它,但使用它并解决问题已经在这篇论坛帖子中讨论过。
本答案仅适用于Python和Windows。我不确定是否有Mac的等效方法。
运行中的Python脚本可以从任务管理器中终止。使用Ctrl + Shift + esc
打开任务管理器。转到进程
选项卡,通过简单地按下del
来终止python.exe
。这只会终止脚本并保持sublime不受影响。
我找到了一种有趣的解决方法。
我的Sublime Text 2中的构建系统会调用我的Makefile,该文件有两个选项并使用ONESHELL指令:
.ONESHELL:
run: myprogram
./myprogram &
echo $$! > "pid.tmp"
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"} }
]
run:
xterm ./myprogram
我可以使用ctrl+c关闭它,而不会影响sublime的工作。
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))
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()
中的一些参数来调用不同的方法 run
和 stop
。
改进建议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()
。
我遇到了同样的问题,只需要在我的程序中处理来自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
启动任务管理器或您计算机上的任何进程管理器(如果没有,请获取一个)。删除相应的python.exe和pythonw.exe进程。
这一页上没有任何答案对我有用。
可悲的事实似乎是,没有什么“文明”的方式可以杀死在sublime上启动的Python脚本(CTRL/COMMAND + B)。
如果您是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
完成。
^C
。如果你在构建日志中点击下来,然后输入control+C,它将停止构建并显示消息[Cancelled]
。