模块与包

导入方式

import os
import os.path
 
from os.path import join, exists
from datetime import datetime as dt
 
# 不推荐:污染命名空间
from os.path import *

模块搜索路径

import sys
print(sys.path)
 
# 搜索顺序:
# 1. 当前脚本所在目录
# 2. PYTHONPATH 环境变量
# 3. 标准库目录
# 4. site-packages(第三方库)
 
sys.path.insert(0, "/path/to/my/modules")  # 临时添加

包结构

mypackage/
├── __init__.py
├── core.py
├── utils.py
└── sub/
    ├── __init__.py
    └── helper.py
# 绝对导入(推荐)
from mypackage import core
from mypackage.utils import helper_fn
from mypackage.sub.helper import do_thing
 
# 相对导入(只能在包内部使用)
# 在 mypackage/core.py 中:
from . import utils           # 同级
from .utils import helper_fn
from ..other import fn        # 上级

__init__.py

# mypackage/__init__.py
 
__all__ = ["core", "utils"]   # 控制 from pkg import * 导出内容
 
# 简化导入路径
from .core import CoreClass
from .utils import util_fn
# 用户可直接:from mypackage import CoreClass

__all__ 与公开 API

# mymodule.py
__all__ = ["public_fn", "PublicClass"]
 
def public_fn():   pass
def _private_fn(): pass    # 约定私有,不进 __all__
 
class PublicClass:  pass
class _Internal:    pass
 
from mymodule import *   # 只导入 __all__ 中的名称

__name__ 守卫

def main():
    print("运行主逻辑")
 
if __name__ == "__main__":
    # 直接运行时执行,被 import 时不执行
    main()

动态导入

import importlib
 
mod = importlib.import_module("os.path")
mod.join("/tmp", "file.txt")
 
# 插件系统
plugin_name = "mypackage.plugins.csv_plugin"
plugin = importlib.import_module(plugin_name)
plugin.run()
 
# 重新加载(开发调试)
importlib.reload(mod)

虚拟环境

# 创建
python -m venv .venv
 
# 激活(Windows)
.venv\Scripts\activate
 
# 激活(Linux/macOS)
source .venv/bin/activate
 
# 管理依赖
pip install requests
pip install -r requirements.txt
pip freeze > requirements.txt

相关链接