Python中模块与包的导入(朴实易懂版的总结)
这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下:
基本注意点
- 模块:一般指一个py文件;包:含有许多py文件的文件夹,含有 或不含有(Python3中允许)__init__文件。
- 凡是在导入时带点的,点的左边都必须是一个包 (import a.fun1 其中a为py文件)这种导入形式是错误的。
2.from a import fun1 a为一个py文件,fun1为该文件的属性或方法,这种导入形式是可以的。 - 一般来说 import 后面不能带点,如:(from a import b.c是错误语法)
- 导入模块时,是将模块的py文件导入进去(执行);导入包时,只会执行包中的__init__文件中的代码,故导入包时一般要导入到最底层,即from dir1.dir2.dir3 import py文件或者类、方法、属性,只有这样才能找到。但是你可以通过先导入一个包,然后在包的文件中的__init__中写相关的import语句(可以绝对,也可以相对),这样也可以通过import 包名 的方式将包中的东西导入进去。
例如:
文件结构

示例1
- 以p0.py为直接执行文件,如在p0文件输入:
import bin
- 在bin文件夹的__init__.py文件中输入:
from . import dir # 相对导入 或者绝对导入: from bin import dir
- 最后,在dir 的__init__.py文件中输入:
from . import p3
# 注意,这时的绝对导入必须为:
from bin.dir import p3
# 因为:后面第四条的给出了原因,dir并不在此时的sys.path中
- 通过以上语句,就能实现从po文件中,仅仅通过import bin 就能导入p3文件去po里面
- 直接执行某个py文件时,会将当前py文件所在的目录添加到sys.path中,而其它模块被被导入其中时并不会将其它模块所在的目录放进sys.path中。
- 用相对路径导入: “.”表示当前目录,“..”表示上一层目录,注意这里的当前表示要导入的某个py文件所在的目录,上一层同理。相对导入时不用考虑是否在sys.path中,一般写在一个包中的__init__文件中。常用于包外使用,从包外某个py文件导入包内某些文件。见示例1的模式
Python import 的搜索路径(即sys.path)
- 在当前目录下搜索该模块,(注意在pycharm中,pycharm会将你的项目路径添加到sys.path中),从这里看出,你所导入到的模块或者包或者模块所在的包,必须是与直接执行的文件同级,
例如 示例1:直接直接执行p0.py sys.path 添加的就是 test目录,那么只有 bin、main 能搜索到,所以from bin.dir import p3是可以的。 - 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索
- 在 Python 安装路径的 lib 库中搜索
软件开发规范

这是程序文件结构的一般规范,里面涉及到包与模块的导入问题
- ①为了能在bin文件下的start.py文件中引入core文件夹下的core.py中的main()函数,(即跨同一目录下的 两个包导入,一般需要将两包的共有目录添加到sys.path中)
start.py文件代码为:(为通用格式)
import os
import sys
sys.path.append(os.path.dirname(os.getcwd()))
from core import core # 注意第一个core为包名,第二为py文件名
if __name__ == '__main__':
core.main()
- ②假如,core文件中写了两个py文件,一个为core.py,另一个为 log_in.py ,为了能在core.py中导入log_in模块,
# 方法1
import log_in
方法1是错的,因为程序的主入口(直接执行的)为start.py文件,又由于添加了项目目录(soft)到sys.path中,故此时sys.path中含有 bin、soft、其它python解释器文件路径,所以无法导入
# 方法2
from core import log_in
方法2是对的 ,因为start.py中已添加项目目录(soft)到sys.path中
参考:https://www.cnblogs.com/linhaifeng/articles/6379069.html
Python中模块与包的导入(朴实易懂版的总结)的更多相关文章
- python中模块,包,库的概念
模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...
- python的模块与包的导入
类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...
- python之模块、包的导入过程和开发规范
摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...
- python中模块,包,库
模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...
- python 中 模块,包, 与常用模块
一 模块 模块:就是一组功能的集合体, 我们的程序可以直接导入模块来复用模块里的功能 导入方式 一般为 : import 模块名 在python中, 模块一般分为四个通用类别 1使用python编写. ...
- Python中 模块、包、库
模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...
- python中模块、包、库的区别和使用
模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...
- python中模块和包的概念
1.模块 一个.py文件就是一个模块.这个文件的名字是:模块名.py.由此可见在python中,文件名和模块名的差别只是有没有后缀.有后缀是文件名,没有后缀是模块名. 每个文件(每个模块)都是一个独立 ...
- python中模块与包
#模块与包#在实际项目中,代码的行数可能上万,甚至上几十万,不可能在一个页面内完成,需要多个程序员通力写作#张三,李四,王五......每天收集大家的代码做一个版本,类似乐高积木一样,每个人负责一部分 ...
随机推荐
- local class incompatible: stream classdesc serialVersionUID = 4125096758372084309, local class serialVersionUID = 7725746634795906143
local class incompatible: stream classdesc serialVersionUID = 4125096758372084309, local class seria ...
- [剑指offer] 54. 字符流中第一个不重复的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- Spring Cloud Config 实现配置中心,看这一篇就够了
Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Clou ...
- linux初学者-iptables篇
linux初学者-iptables篇 iptables是防火墙的一种,是用来设置.维护和检查linux内核的IP过滤规则的,可以完成封包过滤.封包重定向和网络地址转换(NAT)等功能. iptabl ...
- java练习---2
//程序员:罗元昊 2017.9.6public class My{ public static void main(String[] args){ int a= ...
- 100天搞定机器学习|Day8 逻辑回归的数学原理
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- vim中 E212:无法打开并写入文件的解决办法
很简单,就是用管理员身份打开这个文件 不要被网上的一些乱七八糟的迷惑了 sudo vim ....... 解决了问题请点个赞,谢谢
- python对数据去重处理
我们在数据处理时,经常需要用到对重复数据进行过滤处理. 对数据去重有两种处理方式,如下: 1.对重复数据去重,并且会自动排序 使用函数 set # 列表去重 list_a = [6, 6, 5, ...
- 【JDK】JDK源码分析-Collection
Java 集合框架(Java Collections Framework, JCF)包含很多平时开发中的常用类,例如 List.Set.ArrayList.HashMap.HashSet 等,因此打算 ...
- 目标检测评价指标mAP 精准率和召回率
首先明确几个概念,精确率,召回率,准确率 精确率precision 召回率recall 准确率accuracy 以一个实际例子入手,假设我们有100个肿瘤病人. 95个良性肿瘤病人,5个恶性肿瘤病人. ...