文件夹观察者仅首次触发脚本,后续新增文件无响应问题排查
问题分析与解决方案
哥们,我一眼就瞅出问题在哪了——你用import TableRun的方式触发脚本执行,这在Python里只管用一次!
问题根源
Python的模块导入机制是这样的:当你第一次import某个模块时,它会执行模块里所有的顶级代码(也就是不在函数里的代码);但之后再调用import,Python只会把已经加载到内存里的模块对象引用过来,不会重新执行模块里的逻辑。所以第一次新增文件时,TableRun里的转换代码正常跑了,但后续触发on_created事件时,import TableRun根本不会再触发转换操作。
三种可行的修复方案
方案1:给TableRun封装执行函数(最推荐)
把TableRun里的CSV转Excel逻辑封装成一个函数,这样每次触发事件时都能主动调用它:
- 修改
TableRun.py,把转换代码放进函数:# TableRun.py def convert_csv_to_excel(target_file=None): # 这里放你原本的CSV转Excel代码 # 如果需要处理新增的文件,可以用target_file参数接收路径 print(f"正在转换文件:{target_file}") # 你的转换逻辑... - 修改观察者的
on_created函数:def on_created(event): print(f"Hey, {event.src_path} has been created!\n") print(f"The other Python file will now be run\n") time.sleep(5) import TableRun # 调用封装好的函数,把新增的文件路径传过去 TableRun.convert_csv_to_excel(event.src_path)
方案2:用importlib.reload强制重载模块(适合不想改TableRun的情况)
如果不想修改TableRun的结构,可以用importlib.reload()强制重新加载模块,让它再次执行顶级代码:
import importlib def on_created(event): print(f"Hey, {event.src_path} has been created!\n") print(f"The other Python file will now be run\n") time.sleep(5) import TableRun # 重新加载模块,触发顶级代码执行 importlib.reload(TableRun)
⚠️ 注意:这种方式不推荐长期使用,因为重载模块可能会导致全局状态混乱,比如模块里的全局变量会被重置。
方案3:用subprocess新开进程执行脚本(完全隔离环境)
直接用subprocess调用TableRun.py,相当于每次都启动一个全新的Python进程来执行脚本,彻底避开模块缓存的问题:
import subprocess import sys def on_created(event): print(f"Hey, {event.src_path} has been created!\n") print(f"The other Python file will now be run\n") time.sleep(5) # 启动新进程执行TableRun.py,还可以传递新增文件的路径作为参数 subprocess.run([sys.executable, "TableRun.py", event.src_path])
然后在TableRun.py里可以通过sys.argv获取传递的文件路径:
# TableRun.py import sys if __name__ == "__main__": target_file = sys.argv[1] # 获取传递的文件路径 # 你的CSV转Excel逻辑,处理target_file...
内容的提问来源于stack exchange,提问作者JeBo
相关产品推荐
相关产品推荐

