os.path

413 阅读2分钟
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath("__file__")))
sys.path.append(BASE_DIR)

1. os.path.abspath("__file__")

  • __file__ 是 Python 中的一个内置变量,它返回当前脚本的绝对路径(文件的路径)。但要注意,__file__ 在某些环境(如交互式环境、某些 IDE 或某些测试框架)下可能不可用。

  • os.path.abspath("__file__")__file__ 转换为绝对路径,确保它是一个完整的文件路径。

    例如,如果当前脚本位于 /home/user/myproject/manage.pyos.path.abspath("__file__") 会返回 /home/user/myproject/manage.py

2. os.path.dirname(path)

  • os.path.dirname(path) 返回指定路径的 父目录。每次调用 os.path.dirname() 都会返回路径的上一级目录。
  • 例如,如果 path/home/user/myproject/manage.py,则 os.path.dirname(path) 返回 /home/user/myproject

3. os.path.dirname(os.path.abspath("__file__"))

  • 这段代码的作用是先得到当前脚本的绝对路径,再获取该路径的父目录。
  • 如果当前脚本路径是 /home/user/myproject/manage.py,那么 os.path.abspath("__file__") 返回 /home/user/myproject/manage.py,然后通过 os.path.dirname() 获取 /home/user/myproject,即脚本所在的目录。

4. os.path.dirname(os.path.dirname(os.path.abspath("__file__")))

  • 通过两次调用 os.path.dirname(),我们可以得到 父目录的父目录,也就是项目的根目录。

  • 假设 __file__ 位于 /home/user/myproject/myapp/views.py,那么:

    • 第一次 os.path.dirname(__file__) 会得到 /home/user/myproject/myapp
    • 第二次 os.path.dirname() 会得到 /home/user/myproject,即项目的根目录。

5. sys.path.append(BASE_DIR)

  • sys.path 是 Python 的模块搜索路径列表。当你导入一个模块时,Python 会按照 sys.path 中的路径顺序搜索该模块。
  • sys.path.append(BASE_DIR) 的作用是将项目的根目录(BASE_DIR)添加到 sys.path 列表的末尾。这样做之后,我们可以在项目的任何位置导入根目录下的模块。

示例:

假设你有以下项目结构:

/home/user/myproject/
    ├── manage.py
    ├── myapp/
    │   └── views.py
    └── myproject/
        └── settings.py

如果在 views.py 中想要导入 settings.py,通常直接导入 settings 可能会报错,因为它不在当前目录下。通过将 BASE_DIR 添加到 sys.path 中,你可以确保能够从任何位置访问到根目录及其子模块。

import sys
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath("__file__")))
sys.path.append(BASE_DIR)

# 现在可以导入根目录下的模块
from myproject import settings

总结

  • os.path.abspath("__file__"):获取当前脚本的绝对路径。
  • os.path.dirname():获取路径的父目录,调用两次可以得到项目的根目录。
  • sys.path.append(BASE_DIR):将项目根目录添加到模块搜索路径中,确保能够在项目中的任何位置访问到根目录下的模块。