Python 检测 运行 应用程序的事件侦听器?
Python event listener to detect running applications?
我想 运行 一个 python 脚本在后台运行很长一段时间。基本上,我正在尝试制作一个生产力脚本,它将在程序 运行ning 时强制关闭分散注意力的应用程序。因此,例如,用户输入 30 分钟,在接下来的 30 分钟内,程序将 运行,并强制关闭诸如 Steam 或 Google Chrome.
之类的东西
目前,我使用带有守护线程的 while 循环工作,不断检查 运行ning 应用程序并在需要时关闭一个应用程序:
while True:
p_tasklist = subprocess.Popen('tasklist.exe /fo csv',
stdout=subprocess.PIPE,
universal_newlines=True)
for p in csv.DictReader(p_tasklist.stdout):
if p['Image Name'] == 'myProgram.exe':
os.system('taskkill /im myProgram.exe')
但显然这是非常 CPU 密集的(一个 CPU 核心是 100%),我试图以某种方式设置一个事件监听器来监听要打开的新程序,但到目前为止一直没有成功。
我试图按照这项工作的思路做一些事情:
while True
# listen for new program to be opened then run next block
if program == program_to_close:
close program
编辑:
为了防止人们过早地结束我的脚本,我需要尽快关闭不需要的程序。否则,脚本可以通过任务管理器结束,对于那些没有自制力的人来说,整个事情毫无意义。
编辑2:
任务管理器是我希望强制关闭的程序之一,而不是 Steam。我不是要制造恶意软件或禁用某人的计算机,如果他们绝对需要退出,他们可以重新启动计算机。
您目前不断地执行外部应用程序,这会占用大量资源。 import sleep from time 并将 sleep(1) 或 sleep(5) 放入 while 循环中。这将减少您的 cpu 使用率。
类似于:
from time import sleep
...your imports...
while True:
p_tasklist........
if matches your criteria:
close program
sleep(number_of_seconds)
好的,为了帮助可能遇到这个问题的任何人,我根据 abarnert 的建议使用 wmi 侦听器让它工作:
import os
import pythoncom
from threading import Thread
import time
import wmi
def listener():
pythoncom.CoInitialize()
c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for("creation")
while True:
new_process = process_watcher()
if new_process.Caption == 'myApplication.exe':
os.system('taskkill /im myApplication.exe')
active_time = int(input('How long would you like to block programs for?'))
t = Thread(target=listener)
t.daemon = True
t.start()
time.sleep(active_time)
这 CPU 的使用率下降到只有几个百分点,而且效果一样好。
我想 运行 一个 python 脚本在后台运行很长一段时间。基本上,我正在尝试制作一个生产力脚本,它将在程序 运行ning 时强制关闭分散注意力的应用程序。因此,例如,用户输入 30 分钟,在接下来的 30 分钟内,程序将 运行,并强制关闭诸如 Steam 或 Google Chrome.
之类的东西目前,我使用带有守护线程的 while 循环工作,不断检查 运行ning 应用程序并在需要时关闭一个应用程序:
while True:
p_tasklist = subprocess.Popen('tasklist.exe /fo csv',
stdout=subprocess.PIPE,
universal_newlines=True)
for p in csv.DictReader(p_tasklist.stdout):
if p['Image Name'] == 'myProgram.exe':
os.system('taskkill /im myProgram.exe')
但显然这是非常 CPU 密集的(一个 CPU 核心是 100%),我试图以某种方式设置一个事件监听器来监听要打开的新程序,但到目前为止一直没有成功。
我试图按照这项工作的思路做一些事情:
while True
# listen for new program to be opened then run next block
if program == program_to_close:
close program
编辑: 为了防止人们过早地结束我的脚本,我需要尽快关闭不需要的程序。否则,脚本可以通过任务管理器结束,对于那些没有自制力的人来说,整个事情毫无意义。
编辑2: 任务管理器是我希望强制关闭的程序之一,而不是 Steam。我不是要制造恶意软件或禁用某人的计算机,如果他们绝对需要退出,他们可以重新启动计算机。
您目前不断地执行外部应用程序,这会占用大量资源。 import sleep from time 并将 sleep(1) 或 sleep(5) 放入 while 循环中。这将减少您的 cpu 使用率。
类似于:
from time import sleep
...your imports...
while True:
p_tasklist........
if matches your criteria:
close program
sleep(number_of_seconds)
好的,为了帮助可能遇到这个问题的任何人,我根据 abarnert 的建议使用 wmi 侦听器让它工作:
import os
import pythoncom
from threading import Thread
import time
import wmi
def listener():
pythoncom.CoInitialize()
c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for("creation")
while True:
new_process = process_watcher()
if new_process.Caption == 'myApplication.exe':
os.system('taskkill /im myApplication.exe')
active_time = int(input('How long would you like to block programs for?'))
t = Thread(target=listener)
t.daemon = True
t.start()
time.sleep(active_time)
这 CPU 的使用率下降到只有几个百分点,而且效果一样好。