python脚本检测目录文件变化自动编译hexo静态文件
让AI帮忙写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| import os from pathlib import Path import os import subprocess import sys def hexo_generate(hexo_dir): try: hexo_path = os.path.abspath(hexo_dir) print(f"目标目录:{hexo_path}")
if not os.path.isdir(hexo_path): print(f"错误:目录不存在 → {hexo_path}") return
os.chdir(hexo_path) print(f"已切换到目录:{os.getcwd()}")
if sys.platform.startswith("win"): print("检测到:Windows 系统") command = "hexo g" else: print("检测到:Linux/Mac 系统") command = "hexo g"
result = subprocess.run( command, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding="utf-8" )
print("\n✅ 执行成功!") print(result.stdout)
except subprocess.CalledProcessError as e: print("\n❌ 命令执行失败:") print(e.stderr) except Exception as e: print("\n❌ 程序异常:", str(e))
class MultiFolderMonitor: def __init__(self, folders: list, include_subfolders=False): """ 初始化多文件夹监视器 :param folders: 文件夹路径列表(可传入多个文件夹) :param include_subfolders: 是否监控子文件夹 """ self.monitors = [] for folder in folders: self.monitors.append( _SingleFolderMonitor(folder, include_subfolders) )
def has_changed(self): """ 统一反馈信号: 只要任意一个文件夹变化 → 返回 True 全部无变化 → 返回 False """ changed = False for monitor in self.monitors: if monitor.has_changed(): changed = True return changed
if __name__ == '__main__': import time
FOLDERS = [ r"D:\Project\hexo\blog\source\_data", r"D:\Project\hexo\blog\source\_posts", ] FOLDERS = [ r"/home/ubuntu/hexo/source/_data", r"/home/ubuntu/hexo/source/_posts", ] monitor = MultiFolderMonitor( folders=FOLDERS, include_subfolders=True ) HEXO_BLOG_DIR = r"D:\Project\hexo\blog" HEXO_BLOG_DIR = r"/home/ubuntu/hexo/"
while True: if monitor.has_changed(): hexo_generate(HEXO_BLOG_DIR) print("✅ 检测到文件夹变化!") time.sleep(1)
|
系统服务运行脚本
1 2 3 4 5 6 7 8 9 10 11 12
| [Unit] Description=has_changed [Service] User=ubuntu ExecStart=/usr/bin/python3 /home/ubuntu/hexo/has_changed.py WorkingDirectory=/home/ubuntu/hexo Restart=on-failure
Environment="PATH=/home/ubuntu/.nvm/versions/node/v22.17.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" [Install] WantedBy=multi-user.target
|
碰到的问题:
在Ubuntu系统下,直接运行脚本能检测到目录文件变化并自动编译,但是在系统服务中运行脚本,检测不到目录文件变化时,不自动执行编译。
解决方法:
在系统服务中运行脚本,需要指定环境变量,否则无法正常运行。
在/etc/systemd/system/has_changed.service文件中添加以下内容:
1 2
| Environment="PATH=/home/ubuntu/.nvm/versions/node/v22.17.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
|
把 /home/ubuntu/.nvm/versions/node/v22.17.0/bin替换为你的node路径
这样做就省去了每次更新文件后需要手动编译的操作。
只需专注于写文档就行了。
另外我服务器还部署了file browser,可以方便地管理和编辑文件。