广告位联系
返回顶部
分享到

python实现同级目录调用的介绍

python 来源:互联网 作者:佚名 发布时间:2024-06-25 22:13:37 人浏览
摘要

通过制作简易的Demo,让其更加深入的了解如何使用 1. 问题所示 发现python的同级目录相互调用会出Bug 1 2 3 4 5 6 7 E:\software\anaconda3\envs\py3.10\python.exe F:\python_project\test\Father\child\file3.py Traceback (mo

通过制作简易的Demo,让其更加深入的了解如何使用

在这里插入图片描述

1. 问题所示

发现python的同级目录相互调用会出Bug

1

2

3

4

5

6

7

E:\software\anaconda3\envs\py3.10\python.exe F:\python_project\test\Father\child\file3.py

Traceback (most recent call last):

  File "F:\python_project\test\Father\child\file3.py", line 1, in <module>

    from ..file1 import greet  # 这将失败,没有 __init__.py

ImportError: attempted relative import with no known parent package

 

Process finished with exit code 1

截图如下:

在这里插入图片描述

2. 原理分析

出现 ImportError: attempted relative import with no known parent package 错误的原因是 Python 无法识别当前脚本的父包,因此相对导入失败

要解决这个问题并理解其背后的原理,需要了解以下几点:

原理分析

相对导入的限制:

相对导入(例如,from …module import something)只能在包(包含 __init__.py 文件的目录)中使用
当运行脚本时,如果它所在的包没有正确识别,Python无法解析相对导入

脚本直接运行的问题:

如果直接运行一个脚本(例如,通过 python file3.py),该脚本的包上下文不会被识别
相对导入会失败,因为Python不知道如何定位脚本的父包

3. 解决方法

先给一个Demo

其文件结构如下:

1

2

3

4

5

test/

├── Father/

│   ├── file1.py

│   └── child/

│       └── file3.py

file1如下:

1

2

def greet():

    print("Hello from file1")

file3如下:

1

2

3

4

5

6

7

from ..file1 import greet  # 这将失败,没有 __init__.py

 

def main():

    greet()

 

if __name__ == "__main__":

    main()

这将执行出错

通用的解决方式有如下:

3.1 添加父目录

在file3中修改代码为如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

import sys

import os

 

# 将父目录添加到 sys.path

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

 

from Father.file1 import greet

 

def main():

    greet()

 

if __name__ == "__main__":

    main()

执行的结果如下:

在这里插入图片描述

3.2 相对路径

修改file3如下:

1

2

3

4

5

6

7

from ..file1 import greet

 

def main():

    greet()

 

if __name__ == "__main__":

    main()

但是 执行结果如下:

在这里插入图片描述

需要使用命令行的方式来执行:

在这里插入图片描述

注意差异

如果file3的文件如下:

1

2

3

4

5

6

7

from Father.file1 import greet

 

def main():

    greet()

 

if __name__ == "__main__":

    main()

还是可以直接运行的:

在这里插入图片描述

3.3 添加init

截图如下:

在这里插入图片描述

对应file3的文件如下:

1

2

3

4

5

6

7

from Father.file1 import greet

 

def main():

    greet()

 

if __name__ == "__main__":

    main()

截图如下:

在这里插入图片描述

也可使用命令行的方式来执行:

在这里插入图片描述

__init__.py 文件在 Python 3.3 及其之后的版本中不是必须的,但它有助于将目录标识为一个包


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计