python - 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 中有效。
解决方案
您可以使用一个技巧来完成这项工作。我不相信这被认为是一种pythonic方式,它在我看来更像是一种解决方法。如果使用不当,可能会产生问题。
想法是将项目及其子目录定义为模块,并将根文件夹项目的路径添加到系统路径中。
您将需要__init__.py
在项目和每个子目录中创建一个空的要在其他地方加载的脚本和函数。
然后的想法是像这样导入:
from folder.subDirec.function1 import function_of_interest
在项目中的每个文件中,您都必须使用语法导入from folder.subDirect.
。仅当您位于上述文件夹中project
或project
已添加到 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()
推荐阅读
- c - 便携和紧凑的位包装
- javascript - API 返回对象
- ios - 将 CURL 命令转换为 URLRequest
- amazon-web-services - 在 Spring Boot 中解析 SNS 推送的 SQS 消息
- php - 如果否则不在布尔值上运行
- ruby - 为什么单引号不适用于 ruby 中的字符串插值
- tensorflow - keras 中的 Grad-CAM,ValueError: Graph disconnected: cannot get value for tensor Tensor "input_11_6:0", shape=(None, 150, 150, 3)
- javascript - 当我在 chrome 上打开一个新标签时如何执行给定的代码?
- javascript - 如何在点击时加载新图像?
- javascript - 基于 SSR nuxtjs 中的身份验证呈现页面