Python import导入上级目录文件的方法

作者:我行我素,向往自由 时间:2022-11-16 01:27:41 

假设有如下目录结构:

-- dir0
| file1.py
| file2.py
| dir3
| file3.py
| dir4
| file4.py

dir0文件夹下有file1.py、file2.py两个文件和dir3、dir4两个子文件夹,dir3中有file3.py文件,dir4中有file4.py文件。

1.导入同级模块

python导入同级模块(在同一个文件夹中的py文件)直接导入即可。

import xxx

如在file1.py中想导入file2.py,注意无需加后缀".py":

import file2
# 使用file2中函数时需加上前缀"file2.",即:
# file2.fuction_name()

2.导入下级模块

导入下级目录模块也很容易,需在下级目录中新建一个空白的__init__.py文件再导入:

from dirname import xxx

如在file1.py中想导入dir3下的file3.py,首先要在dir3中新建一个空白的__init__.py文件。

-- dir0
| file1.py
| file2.py
| dir3
| __init__.py
| file3.py
| dir4
| file4.py

再使用如下语句:

# plan A
from dir3 import file3

或是:

# plan B
import dir3.file3
# import dir3.file3 as df3

但使用第二种方式则下文需要一直带着路径dir3书写,较为累赘,建议可以另起一个别名。

3.导入上级模块

要导入上级目录下模块,可以使用sys.path:

import sys
sys.path.append("..")
import xxx

如在file4.py中想引入import上级目录下的file1.py:

import sys
sys.path.append("..")
import file1

sys.path的作用:当使用import语句导入模块时,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块,所以这里是直接把上级目录加到了sys.path里。

“..”的含义:等同于linux里的‘..’,表示当前工作目录的上级目录。实际上python中的‘.’也和linux中一致,表示当前目录。

4.导入隔壁文件夹下的模块

如在file4.py中想引入import在dir3目录下的file3.py。

这其实是前面两个操作的组合,其思路本质上是将上级目录加到sys.path里,再按照对下级目录模块的方式导入。

同样需要被引文件夹也就是dir3下有空的__init__.py文件。

-- dir
| file1.py
| file2.py
| dir3
| __init__.py
| file3.py
| dir4
| file4.py

同时也要将上级目录加到sys.path里:

import sys
sys.path.append("..")
from dir3 import file3

5.常见错误及import原理

在使用直接从上级目录引入模块的操作时:

from .. import xxx

经常会报错:

ValueError: attempted relative import beyond top-level package

这是由于相对导入时,文件夹实质上充当的是package,也就是包的角色(比如我们常用的numpy、pandas都是包)。如果python解释器没有认同该文件夹是package,那么这就是一个普通的文件夹,无法实现相对导入。

文件夹作为package需要满足如下两个条件:

  1. 文件夹中必须存在有__init__.py文件,可以为空。

    1. 不能作为顶层模块来执行该文件夹中的py文件。

来源:https://blog.csdn.net/m0_58086930/article/details/128699867

标签:Python,导入,上级,目录
0
投稿

猜你喜欢

  • Python抓取框架Scrapy爬虫入门:页面提取

    2022-04-16 18:57:47
  • ASP教程:自己写的数据库操作类

    2008-11-21 17:29:00
  • PHP中的session永不过期的解决思路及实现方法分享

    2023-11-20 11:19:23
  • Python3基础之list列表实例解析

    2022-04-22 16:07:15
  • 使用python实现对元素的长截图功能

    2023-11-20 10:27:44
  • 解决Python报错问题[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE]

    2021-08-20 23:26:07
  • php-fpm报502问题的解决办法

    2023-10-12 04:12:23
  • Vue页面手动刷新,实现导航栏激活项还原到初始状态

    2024-05-03 15:11:44
  • 讲解Access数据库中数据表的自动重新联接

    2008-11-28 16:29:00
  • 用svg制作富有动态的tooltip

    2024-04-18 10:10:42
  • python 基于dlib库的人脸检测的实现

    2022-08-23 22:59:07
  • python 使用socket传输图片视频等文件的实现方式

    2022-11-12 11:55:37
  • Javascript的一种模块模式

    2007-12-05 14:04:00
  • Python的Twisted框架上手前所必须了解的异步编程思想

    2021-05-02 14:21:44
  • 论标志的简洁性

    2009-10-27 16:05:00
  • 详解Vue.js 可拖放文本框组件的使用

    2024-04-27 15:47:22
  • python监控网站运行异常并发送邮件的方法

    2021-07-28 06:27:34
  • laravel 5异常错误:FatalErrorException in Handler.php line 38的解决

    2024-06-05 09:22:11
  • JS仿iGoogle自定义首页模块拖拽特效的方法

    2024-04-22 22:36:37
  • Python绘图之桃花盛开

    2022-03-20 08:05:50
  • asp之家 网络编程 m.aspxhome.com