python如何使用import引入其他目录文件或自定义模块

 更新时间:2024年02月26日 14:56:48   作者:雪的期许  
这篇文章主要介绍了python如何使用import引入其他目录文件或自定义模块方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题描述

在python工程中,常常需要使用import引入自己编写的其他模块,但其它模块有时不在同一个文件夹下。

此时直接import会导致找不到包而报错

ModuleNotFoundError: No module named '****'

下面提供2种解决方案。

解决方案

以下面的项目结构为例进行说明。


方案1:使用相对路径(局限)

在import时直接使用相对路径

  • .代表当前文件所在路径
  • ..代表当前文件的父目录
  • ...代表爷爷目录,以此类推,每多一个点,就向上翻一层目录。

例1,在f1.py中写:

from ..p2 import f2.py

例2,在t1.py中写:

from ..b import t2.py

这样写能否执行成功,取决于主函数入口(即你执行的文件)!记住这个原则(局限):

相对路径所涉及的目录范围内不允许有主函数入口

不满足这个原则时,报错

ValueError: attempted relative import beyond top-level package

在上面的项目结构中,如果我们执行python main.py,那么在main.py中引入t1.py会报错,

原因是t1.py中使用相对引入时,..回退到的目录是项目主目录,也就是main.py所在的目录,违反了该原则。

但在main.py中引入f1.py是正确的,因为f1.py在使用相对路径引入时最多回退到pkg文件夹,不会影响main.py的执行。

方案2:绝对路径引入(推荐)

1. 在main.py中调用t1.py

这个很常规,直接在main.py使用import即可

form a.t1 import *

2. 在t1.py中调用main.py

t1.py中写:

import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))  # 将父级目录加入执行目录列表

from main import *  # 由于main.py所在目录已加入到sys.path,可直接引入

代码中parents返回一个列表,parents[0]代表该文件所在目录,下标每加一,目录向上一层,所以这里parents[1]得到的是父目录。

3. 几个坑

1. os.getcwd()

  • 这个函数获取的始终是当前终端所在目录
  • 例如我的终端现在处在/home/code/下,执行python a/1.py,文件1.py中的语句os.getcwd()返回值为/home/code/

2. __file__

  • 当前文件相对于终端的路径
  • 例如我的终端现在处在/home/code/下,执行python a/1.py,文件1.py中的语句__file__返回值为a/1.py
  • 使用os.path.abspath(__file__)可获得该文件的绝对路径/home/code/a/1.py
  • Tips:拼接路径os.getcwd()/__file__就是该文件的完整绝对路径。

3. sys.path[0]

  • 直接运行py文件,即python xxx.py时,为执行文件所在的绝对目录(不管终端处于什么路径)。
  • 需要注意,若执行python 1.py,而1.py中又import了其他目录的2.py,那么2.pysys.path[0]1.py中相等,也就是说在import其他文件时,其他文件的sys.path[0]将以当前被执行的文件为准。
  • 以模块运行时,即python -m xxx时,为终端所在绝对目录,等于os.getcwd()

4. 小结

  • .py文件中,使用__file__最保险。
  • 但是在.ipynb文件中不存在__file__变量,怎么办?
  • 由于.ipynb文件一般不考虑被其他文件import,因此直接使用sys.path[0]取得文件所在目录即可。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何利用Python写个坦克大战

    如何利用Python写个坦克大战

    这篇文章主要给大家介绍了关于如何利用Python写个坦克大战的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python使用matplotlib实现绘制自定义图形功能示例

    Python使用matplotlib实现绘制自定义图形功能示例

    这篇文章主要介绍了Python使用matplotlib实现绘制自定义图形功能,结合实例形式分析了Python基于matplotlib模块实现自定义图形绘制相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    这篇文章主要介绍了详解利用OpenCV提取图像中的矩形区域(PPT屏幕等),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • win32com操作word之Application&Documents接口学习

    win32com操作word之Application&Documents接口学习

    这篇文章主要为大家介绍了win32com操作word之Application&Documents接口学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • PyTorch搭建一维线性回归模型(二)

    PyTorch搭建一维线性回归模型(二)

    这篇文章主要为大家详细介绍了PyTorch搭建一维线性回归模型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • numpy.ndarray 交换多维数组(矩阵)的行/列方法

    numpy.ndarray 交换多维数组(矩阵)的行/列方法

    今天小编就为大家分享一篇numpy.ndarray 交换多维数组(矩阵)的行/列方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Numpy中np.max的用法及np.maximum区别

    Numpy中np.max的用法及np.maximum区别

    这篇文章主要介绍了Numpy中np.max的用法及np.maximum区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python KeyError异常的原因及问题解决

    Python KeyError异常的原因及问题解决

    KeyError是Python内置异常之一,KeyError是当试图获取字典中不存在的键时,引发的异常,本文就来介绍一下KeyError异常的原因及问题解决,感兴趣的可以了解一下
    2024-12-12
  • python实现梯度下降求解逻辑回归

    python实现梯度下降求解逻辑回归

    这篇文章主要为大家详细介绍了python实现梯度下降求解逻辑回归,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • python上下文管理器异常问题解决方法

    python上下文管理器异常问题解决方法

    在本篇文章里小编给大家整理的是一篇关于python上下文管理器异常问题解决方法,对此有兴趣的朋友们可以学习参考下。
    2021-02-02

最新评论