AgentSkillsCN

repl-friendly-import-patching

将项目根目录添加至 sys.path,以确保正确导入模块;同时通过 try/except 机制,从容应对 REPL 环境(如 PyCharm、IPython、Jupyter)中 __file__ 未定义的情况。此技能适用于编写需从父级或祖父级目录导入模块的 Python 脚本,且在交互式环境中同样适用。

SKILL.md
--- frontmatter
name: repl-friendly-import-patching
description: Adds project root directories to sys.path for proper imports, with try/except to handle REPL environments (PyCharm, ipython, Jupyter) where __file__ is undefined. Use when writing Python scripts that need to import from parent/grandparent directories and should also work in interactive environments.

REPL-Safe Import Fix

Overview

This skill provides a reusable pattern to add parent/grandparent directories to sys.path for proper imports, while gracefully handling REPL environments where __file__ is not defined.

When To Use

  • Writing Python scripts in subdirectories that need to import from parent folders
  • Creating scripts that should work both as standalone files AND in REPL/interactive environments
  • Setting up import paths for scripts in src/scripts/, tests/, or similar nested directories

The Pattern

python
import sys
from pathlib import Path

try:
    ROOT = Path(__file__).resolve().parents[2]  # Adjust index: 1=parent, 2=grandparent
    SRC_DIR = ROOT / "src"
    LIB_DIR = ROOT / "lib"
    for path in (SRC_DIR, LIB_DIR, ROOT):
        path_str = str(path)
        if path_str not in sys.path:
            sys.path.insert(0, path_str)
except Exception:
    """REPL environments (PyCharm, ipython, Jupyter) don't set __file__."""
    pass

# Now imports work from project root
from common import Utils  # Works!

Customization

Adjust .parents[N] based on script location:

  • parents[0] = same directory as script
  • parents[1] = parent directory
  • parents[2] = grandparent (e.g., src/scripts/foo.py → project root)

Add more directories as needed:

python
for path in (SRC_DIR, LIB_DIR, TESTS_DIR, ROOT):

Notes

  • Uses sys.path.insert(0, ...) to prioritize project imports over system packages
  • Checks if path_str not in sys.path to avoid duplicates
  • The except Exception block silently passes in REPL—assumes REPL user has already set up paths or is in the correct directory