如何通過網(wǎng)頁超鏈接控制電腦應(yīng)用程序
點擊關(guān)注“Python數(shù)據(jù)分析實例”
設(shè)為“置頂或星標”,送達干貨不錯過!
大家好,我是Brook!
今日主題:如何通過手機網(wǎng)頁超鏈接控制電腦應(yīng)用程序
繼上一篇:用Python實現(xiàn)手機實時監(jiān)控電腦資源
我們通過手機端可以管理電腦進程資源,上一篇推文已經(jīng)實現(xiàn)對電腦進程資源查看,本次介紹如何實現(xiàn)對電腦應(yīng)用程序的啟停管理。
1、系統(tǒng)信息監(jiān)控psutil模塊,獲取監(jiān)控應(yīng)用指標(這里主要包括進程pid、應(yīng)用名稱name、內(nèi)存信息memory_info等,具體其他參數(shù)獲取可查看文檔手冊。),生成data.json數(shù)據(jù)供后續(xù)網(wǎng)頁模板用。
2、利用Flask生成展示網(wǎng)頁,首先準備展示模板template.html,加載數(shù)據(jù)映射到對應(yīng)的模板中輸出展示網(wǎng)頁。
3、通過點擊手機網(wǎng)頁需要關(guān)閉的應(yīng)用程序超鏈接,傳參進程名name到指定的路由函數(shù)執(zhí)行調(diào)用殺掉進程樹函數(shù)模塊來關(guān)閉進程。當然也可以利用websocket實現(xiàn),更方便體驗更佳,后期進一步分享。
from?flask?import?Flask,request,redirect
import?psutil
import?json
import?string
import?by_pid_kill_proc?as?kill_proc
app?=?Flask(__name__)
#?獲取系統(tǒng)進程列表
def?find_procs():
????pass
????return
@app.route('/kill_proL/' ,methods=['GET'])
def?kill_proL(name):
????PID?=?kill_proc.get_procs_pid(str(name))
????kill_proc.execute_kill_proc(PID)
????print('{0}進程已關(guān)閉'.format(name))
????Show_html()?#刷新存活進程列表
????return?redirect("http://192.168.0.2:8888")?#重新加載頁面
@app.route('/')
def?Show_html():
????????........
????content?=?""
????for?i,?(name,memory_info)?in?enumerate(data.items()):
????????content?+=?""
????????content?+=?f"{i?+?1} "
????????content?+=?f"{name} "
????????#content?+=?f"{name} "
????????content?+=?f"{memory_info} "
????????content?+=?" "
????????........
????return?output_html
if?__name__=="__main__":
????app.run(host="0.0.0.0",port=8888)
具體殺掉進程樹by_pid_kill_proc.py模塊代碼如下
import?os
import??pandas?as?pd
import?signal
import?psutil
#?獲取系統(tǒng)進程列表
def?get_procs_pid(pro_name=None):
????Listname=[]
????Listpid=[]
????for?proc?in?psutil.process_iter():
????????try:
????????????pinfo?=?proc.as_dict(attrs=['pid',?'name'])
????????????Listname.append(pinfo.get('name'))
????????????Listpid.append(pinfo.get('pid'))
????????except?psutil.NoSuchProcess:
????????????pass
????L={"name":Listname,"pid":Listpid}
????df=pd.DataFrame(L)
????k_v=df.set_index('name')['pid'].to_dict()
????#獲取進程pid
????pid=k_v[pro_name]
????return?pid
????
#殺掉進程樹
def?kill_proc_tree(pid,sig=signal.SIGTERM,include_parent=True,timeout=None,on_terminate=None):
????if?pid?==os.getpid():
????????raise?RuntimeError("I?refuse?to?kill?myself")
????parent?=psutil.Process(pid)
????children=parent.children(recursive=True)
????if?include_parent:
????????children.append(parent)
????for?p?in?children:
????????p.send_signal(sig)
????gone,alive?=psutil.wait_procs(children,timeout=timeout,callback=on_terminate)
????return?(gone,alive)
#執(zhí)行關(guān)閉應(yīng)用
def?execute_kill_proc(PID):
????kill_proc_tree(PID,sig=signal.SIGTERM,include_parent=True)注:
def?execute_cmd_command(PID):
????os.system("ntsd?-c?q?-p?PID".format(PID))

2、通過進程PID來關(guān)閉進程
建立程序名稱和PID字典,通過傳參應(yīng)用名稱得到相應(yīng)的PID,然后利用PID關(guān)閉應(yīng)用。應(yīng)用程序PID啟動時是隨機的,不能指定pid啟用程序,因此采用網(wǎng)頁超鏈接調(diào)用本地exe程序。
1)啟動注冊表:win+r——regedit,打開注冊表

2)建立私有協(xié)議:在HKEY_CLASSES_ROOT下建立一個自己的協(xié)議名稱,右鍵新建項,如myProject,下面繼續(xù)按照以下結(jié)構(gòu)創(chuàng)建項;

3)首先myProject項,建立URL Protocol項,并設(shè)定默認數(shù)據(jù);

其次DefaultIcon項,設(shè)置成需要執(zhí)行應(yīng)用全路徑,演示的是百度網(wǎng)盤的開啟;

最后command項,設(shè)定數(shù)據(jù)為exe文件全路徑+參數(shù),這里%1就是傳遞給exe的參數(shù),exe文件接收到該參數(shù)并執(zhí)行。0表示完整執(zhí)行路徑,1表示網(wǎng)頁傳過來的字符串。

3、網(wǎng)絡(luò)安全問題
如果用于生產(chǎn)環(huán)境,還需網(wǎng)絡(luò)安全因素。
網(wǎng)頁實現(xiàn)效果
同樣在同一個局域網(wǎng)內(nèi)手機端點擊應(yīng)用名稱即可遠程管理應(yīng)用。

