模块是单个 .py 文件;包是模块的目录。导入让你使用来自其他模块的代码,将程序组织成可重用的部分。
模块和导入
python
(): a + b
PI =
# main.py — different ways to import
import math_utils # import the whole module
math_utils.add(2, 3) # access via the module name
from math_utils import add, PI # import specific names
add(2, 3) # use directly
from math_utils import add as plus # import with an alias
import numpy as np # common aliasing convention
mypackage/
__init__.py ← marks it as a package (can be empty)
module_a.py
subpackage/
__init__.py
module_b.py
from mypackage.module_a import something
from mypackage.subpackage.module_b import other
__init__.py 文件将目录标记为包(并可以运行包初始化代码或定义 from package import * 公开的内容)。
if __name__ == "__main__" 习语def main():
print("running as a script")
if __name__ == "__main__": # True only when run directly, not when imported
main()
这让文件既可作为可导入的模块又可作为可运行脚本 — 其下面的代码只在文件直接执行时运行(python file.py),而不是在导入时运行。一个几乎通用的 Python 习语。
import sys
sys.path # the list of directories Python searches for imports
# includes: the current directory, installed packages (site-packages), stdlib
import os, json, datetime # standard library — "batteries included"
import requests # third-party — installed via pip from PyPI
模块和包是你将 Python 代码组织成可重用、可维护的单元的方式,而不是一个巨大文件 — 对任何非平凡的项目都是基础。
理解导入风格、包结构(__init__.py)、if __name__ == "__main__" 习语(双脚本/模块行为)和 Python 如何查找模块(sys.path)对于构建项目、重用代码以及利用广泛的标准库和 PyPI 生态系统至关重要。
导入错误和结构混淆是常见的早期障碍,这些知识可以解决这些问题。