Python: 关于 Package 和 Module 快速入门

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2024/11/29/python-package-module-quick-start/

什么是 包 (Package)

如果一个目录中有 __init__.py , 那这个目录就是 包 Package

什么是 模块 (Module)

xxx.py 文件就是模块

怎么引用自定义包

包路径 使用 sys.path.append(xxx) 添加后, 就可以使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# import {Package}

from x.Package import Module
print(f"Module.Attribute")

from x.Package.Module import Attribute
print(f"{Attribute}")

# 别名
from x.Package.Module import Attribute as attr
print(f"{attr}")

不能使用 连续的 . 结构

1
2
import x.Package
print(f"{Package.Module.Attribute}")

Package and Module Practice

1
2
3
4
5
6
7
8
app/
├── __init__.py         # Optional for Python 3.3+, but helps clarify it's a package
├── config/
│   ├── __init__.py     # Makes 'config' a subpackage
│   └── config.py
├── ecs/
│   ├── __init__.py     # Makes 'ecs' a subpackage
│   └── ecs.py

1. 使用文件方式执行 - 绝对路径

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# app/ecs/ecs.py
import sys
import os

# Add the parent directory to sys.path to make 'config' importable
## 添加上了 app 到 sys.path 中
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

## 使用绝对路径引用
from config.config import ACCESS_KEY

def main():
    print(f"The AWS Access Key is: {ACCESS_KEY}")

if __name__ == "__main__":
    main()

才能 在本地路径中 使用文件方式执行, 才能使用 兄弟目录 的模块。

1
python ecs.py

也可以回到 根目录 使用模块方式启动

1
2
cd app
python -m ecs.ecs

2. 使用模块方式执行 - 相对路径

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# app/ecs/ecs.py

# Relative import of ACCESS_KEY from config module
from ..config.config import ACCESS_KEY

def main():
    print(f"The AWS Access Key is: {ACCESS_KEY}")

if __name__ == "__main__":
    main()

使用 相对路径 引用模块, 只能使用 模块方式 启动。 且启动位置只能是 根目录

1
2
cd app
python -m ecs.ecs

The -m flag runs the module in a package-aware manner, which allows Python to resolve relative imports properly. If you run ecs.py directly as a script (python ecs.py), Python won’t recognize it as part of the app package, and the relative import will fail.