在Python中,如何从具有相对路径的祖父表文件夹导入?

时间:2018-01-18 14:51:09

标签: python python-3.x python-import relative-path

想象一下文件夹结构如下:

project/
    grandparent.py
    folder1/
        parent.py
        folder2/
            sibling.py
            current.py

如果我在current.py我可以从其他文件using relative paths导入,如下所示:

from .sibling import *
from ..parent import *

如何从grandparent.py导入?

(我已尝试...grandparent../..grandparent

2 个答案:

答案 0 :(得分:2)

创建Python包

作为确保某种程度安全性的方法 - 以便Python模块无法访问不受欢迎的区域 - 通常禁止从父母或祖父母进口... 除非您创建包

幸运的是,在Python中,创建一个包是 crazy-easy 。您只需在每个要作为包的一部分处理的文件夹/目录中添加__init__.py文件。而且,__init__.py文件 甚至不需要包含任何内容 。您只需要存在(可能为空)文件。

例如:

#current.py

from folder1.grandparent import display

display()

#grandparent.py
def display():
    print("grandparent")

# ├── folder1
# │   ├── __init__.py
# │   ├── folder2
# │   │   ├── __init__.py
# │   │   └── folder3
# │   │       ├── __init__.py
# │   │       └── current.py
# │   └── grandparent.py

后续步骤

这不在OP的问题中,但高度相关且值得一提:如果您导入目录而不是模块(文件),那么您要导入{{1文件。如,

__init__.py

实际上在import folder1 目录中执行__init__.py文件的导入。

最后,经常使用双下划线,它缩短为dunder。所以说话时,你可以说" dunder init"引用folder1

答案 1 :(得分:-2)

current.py

import os
import sys
FILE_ABSOLUTE_PATH = os.path.abspath(__file__)  # get absolute filepath
CURRENT_DIR = os.path.dirname(FILE_ABSOLUTE_PATH)  # get directory path of file
PARENT_DIR = os.path.dirname(CURRENT_DIR)  # get parent directory path
BASE_DIR = os.path.dirname(PARENT_DIR)  # get grand parent directory path
# or you can directly get grandparent directory path as below
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

sys.path.append(BASE_DIR)  # append the path to system
import grandparent
from folder1 import parent  # this way you can import files from parent directory too instead of again appending it to system path