LLM学习-Python基础知识

52 阅读5分钟

模块系统

模块的定义

模块是一个包含Python定义和语句的文件,文件名就是模块名加上.py扩展名。例如,有一个math_utils.py的文件,它就是一个模块,文件内容可以是可以是一些函数、类、变量的定义,如下所示

# math_utils.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

模块的导入方式

1. import 语句

使用 import 语句可以导入整个模块,之后可以通过模块名来访问模块中的属性和方法。

mport math_utils

result = math_utils.add(3, 5)
print(result)  # 输出: 8

2. from...import 语句

使用 from...import 语句可以从模块中导入特定的属性或方法,导入后可以直接使用这些属性或方法,而不需要通过模块名来访问。

from math_utils import add

result = add(3, 5)
print(result)  # 输出: 8

3. from...import * 语句

使用 from...import * 语句可以导入模块中的所有属性和方法,导入后可以直接使用这些属性和方法,但这种方式可能会导致命名冲突,不建议在生产环境中大量使用。

4. 给模块或导入的属性起别名

使用 as 关键字可以给模块或导入的属性起别名,方便在代码中使用。

import math_utils as mu 

result = mu.add(3, 5) 
print(result) # 输出: 8 

from math_utils import add as addition 

result = addition(3, 5) 
print(result) # 输出: 8

模块的搜索路径

当使用import语句导入模块时,Python会按照一定的顺序在特定的路径中搜索模块文件。这些搜索路径存在sys.path列表中,可以通过以下代码查看

import sys

print(sys.path)

sys.path 列表通常包含以下几类路径:

  • 程序所在目录:Python 会首先在当前执行程序所在的目录中搜索模块。
  • 标准库目录:包含 Python 标准库模块的目录。
  • 环境变量 PYTHONPATH 指定的目录:可以通过设置 PYTHONPATH 环境变量来添加额外的模块搜索路径。
  • 第三方库安装目录:如 site-packages 目录,用于安装通过 pip 等工具安装的第三方库。

包的概念

包是一种包含__init__.py文件的目录。init.py文件可以为空,也可以包含一些初始化代码。通过使用包,可以相关的模块组织在一起,形成一个层次化的结构。例如,有一个my_package的包,其目录结构文件如下:

my_package/
    __init__.py
    module1.py
    module2.py
    sub_package/
        __init__.py
        sub_module.py

可以使用以下方式导入包中的模块

import my_package.module1
from my_package import module2
from my_package.sub_package import sub_module

__name__属性
每个模块都有一个__name__属性,用于标识模块的名称。当模块作为脚本直接运行时,__name__属性值为"main";当模块被导入到其他模块使用时,__name__属性的值为模块的名称;利用这一特性可以在模块中编写一些测试代码,示例如下:

# math_utils.py
def add(a, b):
    return a + b
  
 if __name__ == '__main__'
     result = add(2, 3)
     print(result) # 只有当 math_utils.py 作为脚本直接运行时才会输出 5

项目结构搭建

实现功能说明

我们的需求是:监听一个指定目录的文件变化,并把变更的文件内容同步到另一个目录。主要功能包括:

  1. 监听文件变化:利用 watchdog 库实现文件变化监控。
  2. 文件同步:当文件有修改时,读取内容并同步到目标目录(可以使用 shutil.copy2 或者自定义同步逻辑)。

项目结构

my_sync_tool/                # 项目根目录
├── my_sync_tool/            # 主模块目录
│   ├── __init__.py          # 包初始化文件
│   ├── cli.py               # 命令行入口
│   └── sync.py              # 文件同步和监听功能实现
├── requirements.txt         # 项目依赖(例如:watchdog)
└── README.md                # 项目说明文件(可选)

  • my_sync_tool/ (内部文件夹):存放核心代码。
  • cli.py:作为命令行入口,负责解析命令行参数,并调用对应的同步功能。
  • sync.py:封装具体的文件监听与同步逻辑。

环境准备

  • 安装 Python:确保你安装了 Python(建议 Python 3.6 及以上)。

  • 创建虚拟环境(可选) :推荐使用虚拟环境管理依赖。

    python -m venv venv
    source venv/bin/activate  # Linux/macOS
    venv\Scripts\activate     # Windows
    
  • 安装依赖:在 requirements.txt 文件中添加 watchdog 库:

    watchdog
    

    然后执行:

    pip install -r requirements.txt
    

代码实现

sync.py


import os
import shutil
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class SyncEventHandler(FileSystemEventHandler):
    def __init__(self, src_dir, dest_dir):
        super().__init__()
        self.src_dir = os.path.abspath(src_dir)
        self.dest_dir = os.path.abspath(dest_dir)
    
    def on_modified(self, event):
        # 当文件被修改时触发
        if not event.is_directory:
            self.sync_file(event.src_path)
    
    def on_created(self, event):
        # 当文件被创建时触发
        if not event.is_directory:
            self.sync_file(event.src_path)
    
    def sync_file(self, src_path):
        # 计算目标文件路径
        relative_path = os.path.relpath(src_path, self.src_dir)
        dest_path = os.path.join(self.dest_dir, relative_path)
        
        # 确保目标目录存在
        os.makedirs(os.path.dirname(dest_path), exist_ok=True)
        
        # 复制文件
        try:
            shutil.copy2(src_path, dest_path)
            print(f"同步文件:{src_path} -> {dest_path}")
        except Exception as e:
            print(f"同步文件 {src_path} 时出错:{e}")

def start_sync(src_dir, dest_dir):
    event_handler = SyncEventHandler(src_dir, dest_dir)
    observer = Observer()
    observer.schedule(event_handler, path=src_dir, recursive=True)
    observer.start()
    print(f"开始监听目录:{src_dir}")
    print(f"同步目标目录:{dest_dir}")
    
    try:
        while True:
            # 循环等待事件(可以用 time.sleep 控制轮询时间)
            pass
    except KeyboardInterrupt:
        print("停止监听")
        observer.stop()
    observer.join()

cli.py

import argparse
from my_sync_tool.my_sync_tool import start_sync

def main():
    parser = argparse.ArgumentParser(description="文件同步工具:监听指定路径文件,并将内容同步到另外一个目录")
    parser.add_argument("src", help="要监听的源目录")
    parser.add_argument("dest", help="文件同步的目标目录")
    args = parser.parse_args()
    start_sync(args.src, args.dest)
    # print(start_sync)


if __name__ == "__main__":
    main()

运行项目

  1. 进入项目根目录
cd my_sync_tool
  1. 运行命令行工具
python -m my_sync_tool.cli /path/to/source /path/to/destination

其中 /path/to/source 为你希望监听的目录,/path/to/destination 为同步的目标目录。