假设有这样的目录结构
project/
├─ pcie_grpc_server/
│ ├─ __init__.py
│ ├─ server.py
│ ├─ config.py
│ └─ service.py
└─ pyproject.toml
我们想运行 server.py 有两种方式,一种是把 pcie_grpc_server 包里的 server 模块当作模块运行
python -m pcie_grpc_server.server
另一种当作普通 python 脚本
python .\server.py
前者(-m 的方式) Python 会认为:
__name__ = "__main__"
__package__ = "pcie_grpc_server"
所以在 server.py 里可以正常使用包内相对导入:
from .config import Configfrom .service import PcieService
也可以使用绝对导入:
from pcie_grpc_server.config import Configfrom pcie_grpc_server.service import PcieService
这种方式更适合正式项目、包、库、服务程序。
后者(直接运行的方式) Python 会认为 server.py 是一个独立脚本,大致相当于:
__name__ = "__main__"
__package__ = None
所以如果 server.py 里写了:
from .config import Config
很可能报错:
ImportError: attempted relative import with no known parent package
因为 Python 不知道这个脚本属于 pcie_grpc_server 包。