模块与包
导入方式
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
相关链接