首页 > 解决方案 > python 从同一文件夹导入模块,但从父级调用

问题描述

我知道有很多类似的问题,但没有一个能解决我的具体问题:我有以下文件夹结构:

project/
       main.py
       /subDirec/
             __init__.py
             function1.py
             function2.py

我想将function2导入function1并从main调用function1。

在function1中我调用

import subDirec.function2 

主要是:

import subDirec.function1

它在我调用 main.py 时有效,但在我调用 function1.py 时无效。如果我在 function1 中将其更改为:

import function2 

它在 function1 中有效,但不再在 main 中有效。

标签: python

解决方案


您可以使用一个技巧来完成这项工作。我不相信这被认为是一种pythonic方式,它在我看来更像是一种解决方法。如果使用不当,可能会产生问题。

想法是将项目及其子目录定义为模块,并将根文件夹项目的路径添加到系统路径中。

您将需要__init__.py在项目和每个子目录中创建一个空的要在其他地方加载的脚本和函数。

然后的想法是像这样导入:

from folder.subDirec.function1 import function_of_interest

在项目中的每个文件中,您都必须使用语法导入from folder.subDirect.。仅当您位于上述文件夹中projectproject已添加到 PATH 时,才能进行此导入。

要将项目路径添加到环境路径,您可以使用:

if __name__ == '__main__':
    import os
    import sys
    base_path = os.path.abspath(__file__).split('project')[0]
    sys.path.append(base_path)

您可以将此代码放在每个文件的顶部,然后再从project.

例如:

project/
   main.py
   __init__.py
   /subDirec/
         __init__.py
         plots.py
         utils.py

utils.py我想使用plots.p1()中,因此utils.py我将拥有:

if __name__ == '__main__':
    import os
    import sys
    base_path = os.path.abspath(__file__).split('project')[0]
    sys.path.append(base_path)

from project.subDirec.plots import p1

p1()

推荐阅读