模块系统
模块的定义
模块是一个包含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
项目结构搭建
实现功能说明
我们的需求是:监听一个指定目录的文件变化,并把变更的文件内容同步到另一个目录。主要功能包括:
- 监听文件变化:利用 watchdog 库实现文件变化监控。
- 文件同步:当文件有修改时,读取内容并同步到目标目录(可以使用
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()
运行项目
- 进入项目根目录:
cd my_sync_tool
- 运行命令行工具:
python -m my_sync_tool.cli /path/to/source /path/to/destination
其中 /path/to/source
为你希望监听的目录,/path/to/destination
为同步的目标目录。