python3.6 Linux下使用pyinotify监听文件目录

本文介绍了一个使用Python的pyinotify库实现的文件监控系统。该系统可以监测指定目录下的文件创建、修改、删除及写入完成等事件,并针对这些事件执行相应的回调函数进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Demo

import pyinotify
import sys
import os

WATCH_PATH = '/home/newdata'  # 监控目录

if not WATCH_PATH:
    print("The WATCH_PATH setting MUST be set.")
    sys.exit()
else:
    if os.path.exists(WATCH_PATH):
        print('Found watch path: path=%s.' % (WATCH_PATH))
    else:
        print('The watch path NOT exists, watching stop now: path=%s.' % (WATCH_PATH))
        sys.exit()



# 事件回调函数
class OnFileHandler(pyinotify.ProcessEvent):
    # 重写文件写入完成函数
    def process_IN_CLOSE_WRITE(self, event):
        # logging.info("create file: %s " % os.path.join(event.path, event.name))
        file_path = os.path.join(event.path, event.name)
        print('文件完成写入',file_path)
        
    # 重写文件删除函数
    def process_IN_DELETE(self, event):
        print("文件删除: %s " % os.path.join(event.path, event.name))
    # 重写文件改变函数
    def process_IN_MODIFY(self, event):
        print("文件改变: %s " % os.path.join(event.path, event.name))

    # 重写文件创建函数
    def process_IN_CREATE(self, event):
        print("文件创建: %s " % os.path.join(event.path, event.name))


def auto_compile(path='.'):

    wm = pyinotify.WatchManager()
    # mask = pyinotify.EventsCodes.ALL_FLAGS.get('IN_CREATE', 0)
    # mask = pyinotify.EventsCodes.FLAG_COLLECTIONS['OP_FLAGS']['IN_CREATE']                               # 监控内容,监听文件创建,删除和被完成写入
    mask = pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE | pyinotify.IN_DELETE
    notifier = pyinotify.Notifier(wm, OnFileHandler())    # 回调函数
    wm.add_watch(path, mask, rec=True, auto_add=True)
    print('Start monitoring %s' % path)
    while True:
        try:
            notifier.process_events()
            if notifier.check_events():
                notifier.read_events()
        except KeyboardInterrupt:
            notifier.stop()
            break

if __name__ == "__main__":
    auto_compile(WATCH_PATH)
    print('monitor close')

 

<think>嗯,用户之前问过Python创建文件的方法,现在又特别询问Linux环境下Python创建文件的情况。我需要考虑用户可能的实际需求和遇到的问题。 首先,用户可能已经在Windows或其他系统上使用Python创建文件,现在切换到Linux环境,想了解有没有不同之处。或者他们在Linux上遇到了权限、路径等问题,需要针对性的解答。 之前的回答已经涵盖了Python创建文件的几种模式,但Linux下的文件权限、路径处理可能更复杂。用户可能关心如何正确处理文件权限,比如执行权限的问题,或者路径中的符号链接。另外,Linux对大小写敏感,可能需要提醒用户注意文件名的大小写。 还要考虑用户是否需要高级功能,比如创建临时文件、处理二进制文件,或者批量创建文件。另外,Linux下的隐藏文件以点开头,可能需要特别提醒。 用户可能是在部署Python应用到Linux服务器时遇到问题,比如权限不足导致的创建失败,或者路径不存在。需要给出解决方案,比如使用os.makedirs创建目录,或者修改权限的命令。 还有,编码问题在Linux下可能更常见,特别是使用UTF-8的情况,要确保用户在创建文件时指定正确的编码,避免乱码。 总结一下,回答需要涵盖基本创建方法,但重点突出Linux下的注意事项,如权限、路径处理、编码、隐藏文件等,并提供常见问题的解决方法。可能还需要补充使用pathlib库的例子,因为它在处理路径时更直观,适合跨平台。</think>以下是在Linux环境下使用Python创建文件的详细指南,包含基础操作、系统特性适配及常见问题解决方案: --- ### 一、基础创建方法 #### 1. 标准文件操作 ```python # 写入模式(覆盖/新建) with open("/var/log/myapp.log", "w") as f: f.write("日志初始化\n") # 追加模式(日志记录推荐) with open("~/data.log", "a") as f: # ~会自动扩展为家目录 f.write(f"{datetime.now()} 新事件\n") ``` #### 2. 安全创建(防覆盖) ```python import os filepath = "critical_data.db" if not os.path.exists(filepath): with open(filepath, "x") as f: f.write("初始数据") else: print("错误:文件已存在!") ``` --- ### 二、Linux特有注意事项 #### 1. 权限管理 ```python # 创建后设置权限 (rw-r--r--) with open("config.cfg", "w") as f: f.write("配置内容") os.chmod("config.cfg", 0o644) # 八进制格式权限 # 创建可执行文件 with open("script.sh", "w") as f: f.write("#!/bin/bash\necho &#39;Hello Linux&#39;") os.chmod("script.sh", 0o755) # 添加执行权限 ``` #### 2. 路径处理规范 ```python from pathlib import Path # 自动处理家目录和符号链接 log_dir = Path("~/symlink_dir").expanduser().resolve() # 解析真实路径 log_dir.mkdir(parents=True, exist_ok=True) # 递归创建目录 (log_dir / "app.log").touch() # 创建空文件 ``` --- ### 三、高级场景实现 #### 1. 创建系统日志文件 ```python import syslog # 通过syslog接口创建日志 syslog.openlog(ident="MyApp", facility=syslog.LOG_LOCAL2) syslog.syslog(syslog.LOG_INFO, "应用程序启动") # 日志自动写入/var/log/ ``` #### 2. inotify监控文件创建 ```python from pyinotify import WatchManager, Notifier, ProcessEvent class FileCreateHandler(ProcessEvent): def process_IN_CREATE(self, event): print(f"检测到新文件:{event.pathname}") wm = WatchManager() mask = pyinotify.IN_CREATE # 监控创建事件 wm.add_watch(&#39;/tmp&#39;, mask) # 监控/tmp目录 notifier = Notifier(wm, FileCreateHandler()) notifier.loop() ``` --- ### 四、常见问题排查 #### 1. 权限错误解决方案 ```bash # 终端授权(示例) sudo chmod 777 /target_dir # 开放权限(生产环境慎用) sudo chown $USER:$USER /target_dir # 修改所有者 ``` #### 2. 特殊目录处理 ```python # 在需要root权限的目录创建文件 import subprocess subprocess.run([&#39;sudo&#39;, &#39;touch&#39;, &#39;/etc/myapp.conf&#39;]) # 通过sudo提权 ``` #### 3. 文件锁定机制 ```python import fcntl with open("shared.log", "a") as f: fcntl.flock(f, fcntl.LOCK_EX) # 获取排他锁 f.write("线程安全写入\n") fcntl.flock(f, fcntl.LOCK_UN) # 释放锁 ``` --- ### 五、性能优化建议 1. **批量写入**:累计数据后集中写入 ```python buffer = [] for i in range(1000): buffer.append(f"记录{i}") with open("bigfile.log", "w") as f: f.write("\n".join(buffer)) ``` 2. **异步写入**(Python 3.7+) ```python import aiofiles async def async_write(): async with aiofiles.open(&#39;async.log&#39;, &#39;w&#39;) as f: await f.write(&#39;异步写入内容&#39;) ``` --- ### 六、推荐工具 1. **logrotate集成**:自动处理日志轮转 2. **systemd服务文件**:规范服务类应用的文件创建位置 3. **SELinux上下文设置**(针对安全敏感场景): ```bash chcon -t httpd_sys_content_t /var/www/html/new_file.html ``` 通过合理运用Linux的文件系统特性结合Python的跨平台能力,可以实现安全高效的自动化文件管理。建议重点注意权限控制、路径解析和日志轮转机制,在涉及系统关键目录操作时优先使用Python标准库而非直接执行shell命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值