当前位置: 首页 > news >正文

How script location, CWD, and relative imports interact

🧱 Scenario: A Modular Package Layout

Suppose you have this structure:

project_root/
├── main.py
├── package/
│   ├── __init__.py
│   ├── utils.py
│   └── logger/
│       ├── __init__.py
│       └── formatter.py

You want main.py to import from package.utils, and utils.py to import from logger.formatter.

🧪 Case 1: Running main.py Directly

bash

cd project_root
python main.py

✅ What Works

  • main.py can do:

    python

    from package import utils
    
  • utils.py can do:

    python

    from .logger import formatter  # ✅ relative import
    

Because:

  • sys.path[0] is project_root

  • package is a valid top-level package

  • Relative imports inside package work as expected

❌ Case 2: Running utils.py Directly

bash

cd project_root/package
python utils.py

❌ What Breaks

  • from .logger import formatter will raise:

    ImportError: attempted relative import with no known parent package
    

Because:

  • Python treats utils.py as a standalone script, not part of a package

  • Relative imports only work when the module is part of a package

✅ Solution: Use -m to Run as a Module

Instead of running utils.py directly, do:

bash

cd project_root
python -m package.utils

Now Python treats package as a proper package, and relative imports work.

🧠 Summary: Best Practices

TaskRecommended Approach
Run top-level scriptpython main.py from project root
Run submodule with importspython -m package.submodule from root
Avoid broken relative importsDon’t run submodules directly as scripts
Debug import issuesPrint sys.path and __name__

🧪 Bonus Tip: Debugging Imports

Add this to any script:

python

import sys
print("sys.path:", sys.path)
print("__name__:", __name__)

This helps you see:

  • Where Python is looking for modules

  • Whether the script is being run as __main__ or as part of a package

http://www.dtcms.com/a/292414.html

相关文章:

  • TIM定时中断
  • 操作系统:系统调用(System Calls)
  • 风险识别清单:构建动态化的风险管理体系
  • 从 0 到 1 搞定 Intel 核显推流:硬件视频编码环境安装完整学习笔记
  • UE5 UI 水平框
  • GoLand 部署第一个项目
  • 智慧制造合同解决方案
  • 外网访问内部私有局域网方案,解决运营商只分配内网IP不给公网IP问题
  • 【Docker】Docker的初步认识以及Ubuntu下的Docker环境安装、配置
  • iOS加固工具有哪些?从零源码到深度混淆的全景解读
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • p5.js 圆弧的用法
  • 一键生成流程图,省时省力!
  • 网络安全基础作业三
  • ubuntu24.04安装CUDA、VLLM、Pytorch等并部署Qwen3-8B-AWQ【50系显卡通用】
  • pytorch 演示 “变分状态空间模型(Variational State-Space Model, VSSM)“ 基于 MINIST数据集
  • CSS中的transform
  • 算法笔记之堆排序
  • Oracle数据恢复—Oracle数据库所在分区被删除后报错的数据恢复案例
  • Oracle 12c 创建数据库初级教程
  • sqli-labs通关笔记-第14关 POST报错型注入(双引号闭合 手工注入+脚本注入两种方法)
  • mac实现sudo命切换node版本
  • 【C++进阶】揭秘list迭代器:从底层实现到极致优化
  • WIFI路由器长期不重启,手机连接时提示无IP分配
  • 【Linux系统】基础IO
  • Git使用git graph插件回滚版本
  • 【自定义一个简单的CNN模型】——深度学习.卷积神经网络
  • 大气能见度监测仪:洞察大气 “清晰度” 的科技之眼
  • 智慧教室:科技赋能,奏响个性化学习新乐章
  • MyBatis拦截器插件:实现敏感数据字段加解密