因为最近在写的测试平台需要在windows上运行,
所以就来探讨了一下windows的dos命令。
友情提示(本公众号实测系列请保存成书签,都是原创的宝贵的踩坑经验。比网上那些各种复制粘贴,只言片语,断文取义,不知原理的所谓教程要强得多。)
首先,在macOs或者linux当中,进程的创建和终止用python3来实现很简单:
mac/linux :
p = subprocess.Popen('python3 test.py‘ , shell=True)
之所以用Popen是因为这是非阻塞的。
仅仅如此简单,就创建了进程。
然后再来看win的创建方法。
win:
p = subprocess.Popen('python3 test.py', shell=True)
怎么样,是不是一模一样。是不是都很简单?好,接下来就是分歧了。
当我们创建完以后,若想杀死这个进程。一般会使用进程的pid来杀死该进程。
而获取pid的方式,mac/linux 和 win就完全不同了。
mac/linux:
p = p.pid
很简单,直接拿p的pid就是了。
不过这个方法在win中行不通,因为种种原因,获取到的pid并不是子进程的pid。所以win的方法如下:
win:
res = subprocess.check_output('wmic process where caption="python.exe" get processid,commandline |findstr "%s"'%“关键字”, shell=True) pid = re.findall(r'(\d+)', str(res))[-1]
如上的命令,首先你要确定你的进程命令主体,在我的举例当中,用的进程是一个python命令,所以要挟“python.exe”
但是为了确保能获取到正确的那个python.exe(因为会有很多)
所以你在一开始的时候,就需要给这个命令后面加上一个关键标识字符串(关键字)
也就是一开始新建进程的时候就应该写成:
p = subprocess.Popen('python3 test.py "关键字"', shell=True)
然后再通过正则和列表提取出真正的pid。
最后来看看,我们拿到了pid后要怎么杀死该进程:
mac/linux:
import os,signal os.kill(int(pid),signal.SIGKILL)
很简单吧~
再看看win的:
subprocess.call('taskkill /PID %s /F'%pid,shell=True)
好了,到这就说完了。
虽然大家可能在网上搜到不少其他各种各样的方法,但是最好还是实际在终端或cmd中执行一下,亲眼看看它们的输出。
不要直接粘贴复制~