2018年7月19日 星期四

Win10下排程執行Python。

Win10下排程執行Python

有時候,人因為有事或是其他因素,無法親自開機並執行程式。JN因為有需求,所以上網學習了要如何定時開機、定時執行程式、定時關機,本文將會分成這三部分教學。


定時開機

能夠持續開機,自然就不會有這問題。但是如果一定要關機的話,定時開機就會被需要。

定時關機需要兩塊的配合:WIN10的設定、BIOS的設定。(JN的主機板是ASUS Z370

必須要把WIN10的快速啟動給取消掉,BIOS的定時啟動才會正常作動


「WIN10的設定」
1.搜尋「電源與睡眠」,進入設定。
2.從右側的相關設定,進入「其他電源設定」。
3.左側控制台首頁下方,點選「選擇按下電源按鈕時的行為」。
4.把「開啟快速啟動」關掉。若無法變更,則選點上方「變更目前無法使用的設定」再嘗試關掉快速啟動。

「BIOS」
1.進入BIOS,找到高級電池管理。(※其他BIOS幾乎也在電池管理
2.開啟「由RTC喚醒」。
3.設定定時喚醒時間。 
※如果沒有先取消「快速啟動」,直接設定此部分可能會無法正常運行。


定時執行程式

定時執行程式會分成兩部分:系統設定、Python程式碼注意事項。尤其是Python程式碼注意事項,常常一個疏漏,就無法如預期地順利執行,但是因為在編寫程式(JN用Visual Studio)上卻是沒有任何問題的。所以,請務必要仔細再仔細地檢查需要定時執行的程式碼。

「系統設定」
1.搜尋「排程工作」,進入排程工作。
2.點選右側的「建立工作」,在「一般」分頁下的安全性設定,勾選「以最高權限執行」。
3.在「觸發程序」,建立自己想要執行程式的時間。
4.在「動作」,「新增」→「瀏覽」自己想要定時執行的程式(.py),按下確定。

※在其他Blog有看到需要設定引數,但是JN此篇沒有設定,因為設定引數方式,是以「python.exe」去執行。如果沒有設定,就是以「cmd」執行。
#2019-07-07:建議輸入引數,在「程式或指令碼」輸入「python」,在「新增引數」輸入完整位置。若不輸入引數,若有用到requests套件則會挑出。只要輸入引數之後,就能正常運作。

兩者的差別在於偵錯與速度,不過會出錯的地方兩者都是一樣的,所以JN會選擇效能較優的「cmd」也就是直接執行.py檔案而不設定引數的方式。
要注意JN有提到的「出錯的地方」,因為使用定時執行程式的環境下,常常是人不在電腦前面的時候,若是有錯,往往只能看到程式已經停止運作而消失在工作列,便無從得知是哪一部份出了問題,建議使用「logging」模組去紀錄程式的運作情形。

「Python程式碼注意事項」
1.不要使用「from XXX import YYY」,也建議不要使用「import YYY as ZZZ」。
※要特別留意到引入的其他自製套件,它們也不能有「from XXX import YYY」
2.不要使用相對路徑,請使用絕對路徑。(Ex: C:\abc\def\mypy.py      不要mypy.py
3.不要包含中文路徑,請使用英文路徑。(Ex: C:\asd\fgh\mypy.py      不要 C:\我的程式\asd
※建議使用「logging」去紀錄程式運作,因為使用排程工作的程式碼出錯會直接終止程式,不會在出錯的地方停住。所以使用logging,萬一程式碼出錯,還能從log去尋找蛛絲馬跡。


定時關機

定時關機有兩種作法,一種是使用「cmd」打上「shutdown -s -c "-s 關機。 -c 顯示提示字串。 -t 設定逾期秒數" -t 300」,然後會在三百秒後關機。另外一種是在python程式碼,引入「os」模組,打上「os.system('c:\\windows\\SysWoW64\\shutdown -s -c "-s 關機。 -c 顯示提示字串。 -t 設定逾期秒數" -t 300')」

使用cmd的方法,可以搭配排程工作,能更精準的在指定時間關機。直接在「排程工作」「動作」「新增」,把關機指令「shutdown -s  -t 300」貼上到指令或程式碼去,它會提示似乎已包含引數,點選「是」。最後在「觸發程序」設定要執行的時程。

使用python的方法,可以搭配「time」模組去取得當前時間,或是在程式結束之前執行關機指令。


後記

這篇文章是已經閱覽過數篇相關,JN覺得可以寫一篇集大成的,給有需要的人直接的參照。JN加註了一些細節,都是JN在嘗試時有用到的,並不是網路教學都有寫到的,也希望能讓人在嘗試時更快找到哪個環節出了問題。