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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (162)

假设文件夹结构如下:

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

如果我在current.py我可以从其他文件中导入使用相对路径详情如下:

from .sibling import *
from ..parent import *

如何从grandparent.py

(我试过了...grandparent../..grandparent)

提问于
用户回答回答于

Curent.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
用户回答回答于

创建Python包

为了确保某种程度的安全性,Python模块不能访问不受欢迎的区域,通常禁止从父母或祖父母处导入.

幸运的是,在Python中,创建一个包只需添加一个__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的问题,而是高度相关的,值得一提的是:如果你导入一个目录而不是模块(文件),而是导入__init__.py档案,例如,

import folder1

实际执行__init__.py文件中的folder1目录。

最后,双下划线经常使用,它被缩短为dunder所以当你说话的时候,你可以说“Dunderinit”来指__init__.py

扫码关注云+社区

领取腾讯云代金券