python啟動(dòng)應(yīng)用程序和終止應(yīng)用程序的方法
1. 目的
每天上班,工作需要,電腦上需要每天開機(jī)啟動(dòng)一些軟件,下班時(shí)候,需要關(guān)掉一些軟件。一個(gè)一個(gè)打開和關(guān)閉貌似是很繁瑣的,于是乎,這個(gè)腳本產(chǎn)生了。
2. 環(huán)境
系統(tǒng)環(huán)境:
- win7-32位
- python 2.7.9
你還需要安裝pywin32。
pip install pywin32
3. 編寫腳本
啟動(dòng)應(yīng)用程序腳本
#coding=utf-8 import win32api #日?qǐng)?bào)軟件啟動(dòng) win32api.ShellExecute(0, 'open', r'C:\Program Files\Pudding\Pudding.exe', '','',1) #OA啟動(dòng) win32api.ShellExecute(0, 'open', r'C:\Program Files\Tongda\ispirit\ispiritPro.exe', '','',1) #QQ啟動(dòng) win32api.ShellExecute(0, 'open', r'D:\QQ\Bin\QQ.exe', '','',1) #...... #當(dāng)然你還可以添加很多你需要啟動(dòng)的軟件
終止應(yīng)用程序腳本
#coding=utf-8 import os #終止QQ軟件 os.system("taskkill /F /IM QQ.exe") #終止日?qǐng)?bào)訂餐軟件 os.system("taskkill /F /IM Pudding.exe") #終止OA軟件 os.system("taskkill /F /IM ispiritPro.exe") #...... #當(dāng)然你還可以添加很多你需要終止的軟件
4. 制作exe
最后把這兩個(gè)腳本制作成exe程序文件,放到桌面上,每次都可以很方便的使用。
python 調(diào)用系統(tǒng)命令,執(zhí)行命令行
python中調(diào)用系統(tǒng)命令的方法還是有比較多的,os/command/subprocess模塊中都有方法可以做到
對(duì)比其他語言(樓主用過的語言也不多):
PHP:exec(),system(), 整體感覺不好用, 阻塞很難受
java:模塊功能很強(qiáng)大,沒的說,功能與python的subprocess很相似
(1) os.system
僅僅在一個(gè)子終端運(yùn)行系統(tǒng)命令,而不能獲取命令執(zhí)行后的返回信息
(2) os.popen
該方法不但執(zhí)行命令還返回執(zhí)行后的信息對(duì)象
(3) 使用模塊commands模塊
常用的主要有兩個(gè)方法:getoutput和getstatusoutput
(4)使用模塊subprocess
說到底還是subprocess最為強(qiáng)大,能實(shí)現(xiàn)很多功能:
比如最近遇到的項(xiàng)目需要再python中調(diào)用shell命令,還要獲取調(diào)用信息,監(jiān)控調(diào)用過程,超時(shí)終止等,這就要求調(diào)用過程不阻塞,還能交互,發(fā)現(xiàn)subprocess完全能滿足,可high了
使用方法(文件轉(zhuǎn)換為例):
time_start = time.time() cmd = "pdf2htmlEX --no-drm 1 --embed-css 0 --embed-image 0 --embed-font 0 --split-pages 1 --fit-width 748 --css-filename html.css --dest-dir %s --embed-external-font 0 --auto-hint 1 %s" % (html_output_folder, src_file) cmd_list = cmd.split(" ") sub2 = subprocess.Popen(cmd_list) i = 0 while 1: ret1 = subprocess.Popen.poll(sub2) if ret1 == 0: time_end = time.time() time_take = int(time_end - time_start + 0.5) with global_value_lock: success_ids[param[2]] = time_take print sub2.pid,'end' break elif ret1 is None: print sub2.pid, 'running' if i >= max_check_time: time_end = time.time() time_take = int(time_end - time_start + 0.5) with global_value_lock: timeout_ids[param[2]] = time_take sub2.kill() log_insert("%s%s%s" % (log_dir(output_folder), os.sep, "convert_log.txt"), src_file, "Timeout_Error", 'None') print "*****************Timeout_Error*****************" break time.sleep(check_time) else: time_end = time.time() time_take = int(time_end - time_start + 0.5) with global_value_lock: converterror_ids[param[2]] = time_take log_insert("%s%s%s" % (log_dir(output_folder), os.sep, "convert_log.txt"), src_file, "Process_Term_Error", str(ret1)) print sub2.pid,'term', ret1, ret1 break i += 1
??!注意:當(dāng)我們直接用cmd而非cmd_list時(shí),得到的pid并不是pdf2html起的進(jìn)程,而是其父進(jìn)程,切記切記
以下是Popen的一些基本用法
Popen它的構(gòu)造函數(shù)如下:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
參數(shù)args可以是字符串或者序列類型(如:list,元組),用于指定進(jìn)程的可執(zhí)行文件及其參數(shù)。如果是序列類型,第一個(gè)元素通常是可執(zhí)行文件的路 徑。我們也可以顯式的使用executeable參數(shù)來指定可執(zhí)行文件的路徑。在windows操作系統(tǒng)上,Popen通過調(diào)用 CreateProcess()來創(chuàng)建子進(jìn)程,CreateProcess接收一個(gè)字符串參數(shù),如果args是序列類型,系統(tǒng)將會(huì)通過 list2cmdline()函數(shù)將序列類型轉(zhuǎn)換為字符串。
參數(shù)bufsize:指定緩沖。我到現(xiàn)在還不清楚這個(gè)參數(shù)的具體含義,望各個(gè)大牛指點(diǎn)。
參數(shù)executable用于指定可執(zhí)行程序。一般情況下我們通過args參數(shù)來設(shè)置所要運(yùn)行的程序。如果將參數(shù)shell設(shè)為 True,executable將指定程序使用的shell。在windows平臺(tái)下,默認(rèn)的shell由COMSPEC環(huán)境變量來指定。
參數(shù)stdin, stdout, stderr分別表示程序的標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤句柄。他們可以是PIPE,文件描述符或文件對(duì)象,也可以設(shè)置為None,表示從父進(jìn)程繼承。
參數(shù)preexec_fn只在Unix平臺(tái)下有效,用于指定一個(gè)可執(zhí)行對(duì)象(callable object),它將在子進(jìn)程運(yùn)行之前被調(diào)用。
參數(shù)Close_sfs:在windows平臺(tái)下,如果close_fds被設(shè)置為True,則新創(chuàng)建的子進(jìn)程將不會(huì)繼承父進(jìn)程的輸入、輸出、錯(cuò)誤管 道。我們不能將close_fds設(shè)置為True同時(shí)重定向子進(jìn)程的標(biāo)準(zhǔn)輸入、輸出與錯(cuò)誤(stdin, stdout, stderr)。
如果參數(shù)shell設(shè)為true,程序?qū)⑼ㄟ^shell來執(zhí)行。
參數(shù)cwd用于設(shè)置子進(jìn)程的當(dāng)前目錄。
參數(shù)env是字典類型,用于指定子進(jìn)程的環(huán)境變量。如果env = None,子進(jìn)程的環(huán)境變量將從父進(jìn)程中繼承。
參數(shù)Universal_newlines:不同操作系統(tǒng)下,文本的換行符是不一樣的。如:windows下用'/r/n'表示換,而Linux下用 ‘/n'。如果將此參數(shù)設(shè)置為True,Python統(tǒng)一把這些換行符當(dāng)作'/n'來處理。
參數(shù)startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的CreateProcess()函數(shù),用 于設(shè)置子進(jìn)程的一些屬性,如:主窗口的外觀,進(jìn)程的優(yōu)先級(jí)等等。
subprocess.PIPE
在創(chuàng)建Popen對(duì)象時(shí),subprocess.PIPE可以初始化stdin, stdout或stderr參數(shù)。表示與子進(jìn)程通信的標(biāo)準(zhǔn)流。
subprocess.STDOUT
創(chuàng)建Popen對(duì)象時(shí),用于初始化stderr參數(shù),表示將錯(cuò)誤通過標(biāo)準(zhǔn)輸出流輸出。
Popen的方法:
Popen.poll()
用于檢查子進(jìn)程是否已經(jīng)結(jié)束。設(shè)置并返回returncode屬性。
Popen.wait()
等待子進(jìn)程結(jié)束。設(shè)置并返回returncode屬性。
Popen.communicate(input=None)
與子進(jìn)程進(jìn)行交互。向stdin發(fā)送數(shù)據(jù),或從stdout和stderr中讀取數(shù)據(jù)??蛇x參數(shù)input指定發(fā)送到子進(jìn)程的參數(shù)。 Communicate()返回一個(gè)元組:(stdoutdata, stderrdata)。注意:如果希望通過進(jìn)程的stdin向其發(fā)送數(shù)據(jù),在創(chuàng)建Popen對(duì)象的時(shí)候,參數(shù)stdin必須被設(shè)置為PIPE。同樣,如 果希望從stdout和stderr獲取數(shù)據(jù),必須將stdout和stderr設(shè)置為PIPE。
Popen.send_signal(signal)
向子進(jìn)程發(fā)送信號(hào)。
Popen.terminate()
停止(stop)子進(jìn)程。在windows平臺(tái)下,該方法將調(diào)用Windows API TerminateProcess()來結(jié)束子進(jìn)程。
Popen.kill()
殺死子進(jìn)程。
Popen.stdin
如果在創(chuàng)建Popen對(duì)象是,參數(shù)stdin被設(shè)置為PIPE,Popen.stdin將返回一個(gè)文件對(duì)象用于策子進(jìn)程發(fā)送指令。否則返回None。
Popen.stdout
如果在創(chuàng)建Popen對(duì)象是,參數(shù)stdout被設(shè)置為PIPE,Popen.stdout將返回一個(gè)文件對(duì)象用于策子進(jìn)程發(fā)送指令。否則返回 None。
Popen.stderr
如果在創(chuàng)建Popen對(duì)象是,參數(shù)stdout被設(shè)置為PIPE,Popen.stdout將返回一個(gè)文件對(duì)象用于策子進(jìn)程發(fā)送指令。否則返回 None。
Popen.pid
獲取子進(jìn)程的進(jìn)程ID。
Popen.returncode
獲取進(jìn)程的返回值。如果進(jìn)程還沒有結(jié)束,返回None。
以上這篇python啟動(dòng)應(yīng)用程序和終止應(yīng)用程序的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
對(duì)Python Pexpect 模塊的使用說明詳解
今天小編就為大家分享一篇對(duì)Python Pexpect 模塊的使用說明詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02如何實(shí)現(xiàn)在遠(yuǎn)程linux服務(wù)器上運(yùn)行python代碼
這篇文章主要介紹了如何實(shí)現(xiàn)在遠(yuǎn)程linux服務(wù)器上運(yùn)行python代碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Python ARP掃描與欺騙實(shí)現(xiàn)全程詳解
這篇文章主要介紹了Python 實(shí)現(xiàn)ARP掃描與欺騙,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10Python 使用threading+Queue實(shí)現(xiàn)線程池示例
今天小編就為大家分享一篇Python 使用threading+Queue實(shí)現(xiàn)線程池示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python+selenium 獲取一組元素屬性值的實(shí)例
今天小編就為大家分享一篇Python+selenium 獲取一組元素屬性值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06用python修改excel表某一列內(nèi)容的操作方法
這篇文章主要介紹了用python修改excel表某一列內(nèi)容的操作代碼,在實(shí)現(xiàn)過程中用到openpyxl這個(gè)庫,要生成隨機(jī)數(shù)就要有random這個(gè)庫,具體代碼跟隨小編一起看看吧2021-06-06深入解析Python的Tornado框架中內(nèi)置的模板引擎
模板引擎是Web開發(fā)框架中負(fù)責(zé)前端展示的關(guān)鍵,這里我們就來以實(shí)例深入解析Python的Tornado框架中內(nèi)置的模板引擎,來學(xué)習(xí)如何編寫Tonardo的模板.2016-07-07Python實(shí)現(xiàn)快速替換Word文檔中的關(guān)鍵字
使用Python自動(dòng)化處理Word文檔可以幫助您提高效率,并減少手動(dòng)處理文檔所需的時(shí)間和精力,所以本文為大家準(zhǔn)備了Python快速替換Word文檔中的關(guān)鍵字的方法,希望對(duì)大家有所幫助2023-06-06用Python實(shí)現(xiàn)職工信息管理系統(tǒng)
這篇文章主要介紹了用Python實(shí)現(xiàn)職工信息管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12