有事会遇到在python代码中导入包错误问题,本文简单对python包的引入做简单介绍

简单说,我认为python导包一共有3种情况,分别是:

要导的包与当前文件在同一层
要导的包在当前文件的底层(就是与当前文件夹同级的文件夹里)
要导的包在当前文件的上层

1、要导的包与当前文件在同一层

use.py

source.py

use.py表示包的调用方,source.py则是被调用方(下面的几种情况同)
这种情况下直接from 文件名 import 函数/类/变量 就行了
如 from source import Source
运行use.py 会成功输出success

要导的包在当前文件的底层

新建一个wrap文件夹,把source.py放进去
这时use.py导入source.py应该是
from wrap.source import Source
如果里面有多层结构,多用几个点就能解决了

要导的包在当前文件的上层
这种情况是最复杂的一种,我们把上面那种情况的source.py和wrap.py换个位置

现在use.py在wrap文件夹里面了,而source.py跑到wrap文件夹外面了
现在use.py要调用source.py应该怎么样调用呢
这时候就需要把文件根目录放入,python包的搜索路径里面。

大家想一想我们调用pip下来的包或者模块的时候,从来都不需要指定什么路径吧,直接使用包名或者模块名就能使用了,比如 import os。
这正是因为pip下来的包或模块所在的文件夹处于python默认的搜索路径里面。py文件import文件的时候,先在当前目录找,找不到就去python的搜索路径里找,因此我们只需要把当前工程的根目录放入python的搜索路径就可以了。
具体操作如下:

在导入我们想导入的包之前,把当前项目的根目录放入python的搜索路径种,这样就能成功导入了。

os.path.dirname(file)

这句的代码的意思是:获取当前文件所在目录的相对路径,当前文件所在文件夹的相对路径就是 **.**了。

os.path.abspath(os.path.dirname(file))

这句代码的意思是把上面获取的相对路径变成绝对路径,我这里是D:\test\wrap,也就是use.py所在文件夹的绝对路径。

os.path.dirname( os.path.abspath(os.path.dirname(file)))

这句代码的意思是获取上面所得到的路径的上一级路径,我这里就得到了D:\test,这个也是我的项目的根路径。

sys.path.insert(0,BASE_DIR)

这句代码表示把BASE_DIR写入到python搜索路径里。
以上写法并非固定,大家根据自己的文件夹结构来写
这样我的D:\test这个路径就加入到python搜索路径中了。
现在我导入Source,只需要这样写 from source import Source,因为source在D:\test目录下,所以能搜索到,同理D:\test的子文件夹里的文件导入方式就可以写出 from wrap.source import Source,注意从插入的根路径开始写路径就行了

python的导包问题的更多相关文章

  1. python相对导包问题

    导包分为:绝对路径.相对路径 在测试时发现不能够使用相对路径 查过之后才知道: 运行模块(如:main.py)中导包只能使用绝对路径,不能使用相对路径 官方文档: Note that relative ...

  2. python 动态导包

    python 包简介 基本导包/模块 import 动态导包/模块 __import__   importlib 1. python 包简介 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和 ...

  3. python导包语句执行

    今天在做项目中遇到一个问题,在first_page中引用login的登录方法,第一次执行登录可以正常登录,登录成功后,再选择返回主菜单,回到上个页面,再选择登录时报错“login_class isno ...

  4. python导包显示No module named XXX问题

    最近用sublime text写python脚本,在导包是一直显示No module named XXX. 问题描述: 首先文件夹的目录结构如下: count.py文件,代码如下: #coding=u ...

  5. python 设置默认的导包路径

    在python中 可以通过 sys 模块添加导包时的搜寻路径, sys.path 返回的是所有默认导包路径的列表(搜索次序从下标为零开始,直到寻找到需要导入的包结束) sys.path.insert( ...

  6. python导包学习总结

    python初学者,对于导包纠结了不少时间,总结分享,持续前进~ Python导包的两种方法: 1.1  from 包.模块  import 方法名,调用时直接使用方法名() 1.2  from 包. ...

  7. python导包问题,这一篇就够了

    解决办法: 将项目所在的根目录添加到sys.path中 在入口文件中加入如下代码: import sys import os # 将 项目的根目录添加到sys.path中 BASE_DIR = os. ...

  8. 记一次Python导包经历

    最近由于需要写一个脚本调用另一个文件里面的一个方法,试了很久都导包失败,特此记录一下 问题背景 1)脚本文件为send_reward.py,要调用public_model_func.py里面的一个类方 ...

  9. Python 基础之import导包

    首先需要将import内容建立一个大概如下层级的包: 以黑色框为第一级,蓝色框为第二级,棕色框为第三级,红色框为第四级 一.import 引入初识 首先在module.py写入代码如下: xboy = ...

随机推荐

  1. Js 模式匹配

    模式匹配: 什么是模式匹配:可以设置查找或替换的规则! 何时使用模式匹配:要查找的关键字可能发生有规律的变化. 如何使用模式匹配: 1.先定义模式:/关键字/模式 比如:var reg=/no/i; ...

  2. CH#46A 磁力块

    题意 磁力块 CH Round #46 - 「Adera 8」杯NOI模拟赛 描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐 ...

  3. 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符

    1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...

  4. 05基于python玩转人工智能最火框架之TensorFlow基础知识

    从helloworld开始 mkdir mooc # 新建一个mooc文件夹 cd mooc mkdir 1.helloworld # 新建一个helloworld文件夹 cd 1.helloworl ...

  5. Understanding the managed heap

    Understanding the managed heap   Another common problem faced by many Unity developers is the unexpe ...

  6. 将数组A中的内容和数组B中的内容进行交换。(数组一样大)

    将两个数组中的内容相互交换,必须是两个数组的内容一样大小. 思路: 结合两个整型变量之间的交换,同样可以用于内容一样大的数组.用异或关系相互交换. #include<stdio.h> in ...

  7. Python 不可变对象练习

    Python 不可变对象练习 str 是不可变对象,就是对这个对象进行操作不会改变这个对象的数据. 如下: >>> a = 'abc' >>> a.replace( ...

  8. Java参数验证Bean Validation 框架

    1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Valid ...

  9. JFrame包含的容器(JRootPane)

    JFrame对象创建后,此对象包含JRootPane类型的容器.JRootPane 下有GlassPane,  和  LayeredPane,LayeredPane下又有ContentPane ,   ...

  10. Hive DDL及DML操作

    一.修改表 增加/删除分区 语法结构 ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ...