使用到系统os模块和psutil模块实现
一、psutil模块:
1.psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
二、代码实现:
首先导入os和psutil模块
import os
import psutil
然后执行以下代码,注释很清楚,细看
pids = psutil.pids() #获取所有进程PID
list=[] #空列表用来存储PID名称
i=0 #计数,程序名称出现的次数
for pid in pids: #遍历所有PID进程
p = psutil.Process(pid) #得到每个PID进程信息
list.append(p.name()) #将PID名称放入列表
s=str(p.name()) #将PID名称转换成字符串进行判断
print(s)
if s =="123.exe": #“123.exe”你要防多开进程的名称
i+=1
接下来进行条件判断
if i<2: #如果这个程序名称在程序管理器中出现次数少于两次,执行以下代码
#这里输入你所要进行的主程序
else: #这个程序名称在任务管理器中出现两次以上,进行程序关掉
pidd=os.getpid() #获取当前PID名称
cmd = 'taskkill /pid ' + "pidd" + ' /f' #输入关闭名称命令
os.system(cmd) #打开系统命令行,将上面的命令导入,即可关掉重复程序
以上就是可以实现的所有代码,套入这个公式,将自己程序打包即可实现。
注意:123.exe 是我的应用名,得改成你的,自己可以在任务管理器找找名称
我自己写了一个简单的demo,可以试着打包运行一下。
import os
import psutil
import cv2
pids = psutil.pids() #获取所有进程PID
list=[] #空列表用来存储PID名称
i=0 #计数,程序名称出现的次数
for pid in pids: #遍历所有PID进程
p = psutil.Process(pid) #得到每个PID进程信息
list.append(p.name()) #将PID名称放入列表
s=str(p.name()) #将PID名称转换成字符串进行判断
print(s)
if s =="123.exe": #“123.exe”你要防多开进程的名称
i+=1
print(list)
print(i)
if i<2: #如果这个程序名称在程序管理器中出现次数少于两次,执行以下代码
# while True:
# print("好")
im1 = cv2.imread(r"E:\\photos\\wangzai.png")
cv2.namedWindow("im1", cv2.WINDOW_NORMAL) # namedWindow 窗口名称+窗口类型 cv2.WINDOW_NORMAL(窗口大小可以拖动)
cv2.imshow("im1", im1)
cv2.waitKey(0)
else: #这个程序名称在任务管理器中出现两次以上,进行程序关掉
pidd=os.getpid() #获取当前PID名称
cmd = 'taskkill /pid ' + "pidd" + ' /f' #输入关闭名称命令
try: #程序防抱死,用try和except
os.system(cmd) #打开系统命令行,将上面的命令导入,即可关掉重复程序
except:
im1 = cv2.imread(r"E:\\photos\\gray.jpg")
cv2.namedWindow("im1", cv2.WINDOW_NORMAL) # namedWindow 窗口名称+窗口类型 cv2.WINDOW_NORMAL(窗口大小可以拖动)
cv2.imshow("im1", im1)
cv2.waitKey(0)
im1 = cv2.imread(r"E:\\photos\\wangzai.png")这一块记的放自己照片路径,不然报错
最后记得打包一下程序,才能实现exe程序防多开,如何打包看这里
(1条消息) python利用pyinstaller打包文件_幼稚园码农的博客-CSDN博客
如有帮助,记得点赞三连