Python的⼏种主动结束程序⽅式
对于如何结束⼀个Python程序或者⽤Python操作去结束⼀个进程等,Python本⾝给出了好⼏种⽅法,⽽这些⽅式也存在着⼀些区别,对相关的⼏种⽅法看了并实践了下,同时也记录下。
参考:
Python 核⼼编程(第⼆版)
1. it()
执⾏该语句会直接退出程序,这也是经常使⽤的⽅法,也不需要考虑平台等因素的影响,⼀般是退出Python程序的⾸选⽅法。
该⽅法中包含⼀个参数status,默认为0,表⽰正常退出,也可以为1,表⽰异常退出。
import sys
该⽅法引发的是⼀个SystemExit异常(这是唯⼀⼀个不会被认为是错误的异常),当没有设置捕获这个异常将会直接退出程序执⾏,当然也可以捕获这个异常进⾏⼀些其他操作。
2. os._exit()
效果也是直接退出,不会抛出异常,但是其使⽤会受到平台的限制,但我们常⽤的Win32平台和基于UNIX的平台不会有所影响。
知乎上有说是调⽤了C 语⾔的 _exit() 函数(未考证)python新手代码例子
3. os.kill()
⼀般⽤于直接Kill掉进程,但是只能在UNIX平台上有效。
基本原理:该函数是模拟传统的UNIX函数发信号给进程,其中包含两个参数:⼀个是进程名,即所要接收信号的进程;⼀个是所要进⾏的操作。
操作(第⼆个参数)的常⽤取值为:
SIGINT 终⽌进程中断进程
SIGTERM 终⽌进程软件终⽌信号
SIGKILL 终⽌进程杀死进程
SIGALRM 闹钟信号
例:
在linux平台上打开VLC视频播放器,然后查看运⾏的进程:进程号是 4497
然后执⾏os.kill操作:
执⾏完之后可以发现VLC视频播放器已经关闭,同时该进程也已经被Kill了。
下边是⽤os.kill()来关闭程序的两个例⼦,似乎windows 下也能⽤
#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import signal
def kill(pid):
try:
a = os.kill(pid, signal.SIGKILL)
# a = os.kill(pid, signal.9) # 与上等效
print '已杀死pid为%s的进程, 返回值是:%s' % (pid, a)
except OSError, e:
print '没有如此进程'
if __name__ == '__main__':
kill(8132)
run_task_1 2 3,预计会更多,需要⼀个简单的办法kill掉某⼀个,或是这是全部kill掉,于是别写了下⾯的这个脚本
#coding=utf-8
import sys,os
def kill_crawler(id):
cmd = 'ps -ef | grep python'
f = os.popen(cmd)
txt = f.readlines()
for line in txt:
colum = line.split()
pid = colum[1]
name = colum[-1]
if name.startswith('run_task_'):
task_id = name[9:-3]
if task_id == id or id =='0':
cmd = "kill -9 %d" % int(pid)
rc = os.system(cmd)
if rc == 0 :
print "stop \"%s\" success!!" % name
else:
print "stop \"%s\" failed!!" % name
if __name__ =='__main__':
if not len(sys.argv)==2:
print u'输⼊要结束的任务编号,0代表停⽌所有'
id = sys.argv[1]
kill_crawler(id)
4. Windows下Kill进程
既然在Linux下能够进⾏上述操作,那么Windows下也能够有相关的操作。
这⾥使⽤的是os.popen(),该⽅法是⽤于直接执⾏系统命令,⽽在Windows下其实就是使⽤taskkill来kill掉进程,其基本形式是,
taskkill /pid 程序的PID号码
可以直接在CMD窗⼝下试下这个命令....
可以先打开⼀个计算器程序,然后使⽤tasklist查看该程序的pid,这⾥是620,所以对应的Python代码是:
import os
if __name__ == "__main__":
pid = 620
os.popen(' /pid:'+str(pid))
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论