python之模块的导入
今天在做一个项目的时候卡在模块导入这个点上了。赶紧回头总结一下
一.被导入的文件和工作的脚本在一个目录下
1.导入一个.py文件里的功能或参数(导入模块)
先看一下目录结构:
module里有两个功能,一个参数,我们要把module里的内容导入到test里(图里的model拼写错误,请忽略~~)
data = 'in the test'
def fun1():
print('in the test fun1')
def fun2():
print('in the test fun2')
module1
有下面这几种方法:
方法1:
import module1
module1.fun1()
module1.fun2()
print(module1.data)
这种方法直接导入了module.py这个文件,然后直接调用里面的参数。相当于在test.py里加了个名字为module1的变量,把原有module1里的内容赋值给这个变量。然后再调用
如果只需导入fun1,可以用方法2
from module1 import fun1
fun1()
这种只导入了fun1一个功能,但调用的时候不用加上前面的模块名作为前缀,用from...import的语法也可以导入模块下所有的功能
from module1 import *
fun1() #不用加模块名,直接调用
fun2()
这个方法相当于把module里的内容直接复制了一遍在test.py内。但是一般情况下是不要用这个语句,因为可能会造成变量的污染:如果原先有个变量或函数名字和导入模块的名字一样,就会被最后出现的覆盖掉
def fun1():
print('in test fun1')
from module1 import *
fun1()
由于module1内有个函数名为fun1,运行以后,打印出的就成,了
in the test fun1
所以常规情况下一定不要用这个方法。单是如果被导入的模块确实和脚本里的变量名称出现冲突,但是两者又都不能更改,可以用这个方法
def fun1():
print('in test fun1')
from module1 import fun1 as fun
fun()
fun1()
运行一下,工作正常
in the test fun1
in test fun1
2.导入包
如果想导入一个包,其实就是导入了包所在目录下的__init__.py这个文件,
我们重新定义下目录结构
fun1和fun2里都定义了个fun
def fun():
print('in fun1 fun')
fun1
def fun():
print('in fun2 fun')
fun2
修改一下__init__.py这个文件,加一句
print('in the module_test2 __init__.py')
然后直接把包导入到test.py中,运行一下,看看发现了什么?
import module_test2
in the module_test2 __init__.py
可以发现,导入包其实就是执行该包下的__init__.py文件。如果想导入包下的所有文件该怎么操作呢?
from module_test2 import fun1,fun2
fun1.fun()
fun2.fun()
这样就可以导入指定的文件了,其实还有一种方法,我们刚才发现了,导入包的时候就是执行了__init__.py文件,其实也可以把这个文件修改一下,
from . import fun1,fun2 # 一定要加from.
这个from . 一定要加否则默认的路径会错误,在test里导入的时候就成了(相对导入)
import module_test2
module_test2.fun1.fun()
module_test2.fun2.fun()
各有各的好处吧。
ps:我其实就是卡在这里了:是想找一个直接全部导入包的方法,不用把每个文件都输一遍,暂时无解。
二.导入非本目录下的模块
在导入模块的时候,一定要把模块的路径加载sys.path列表里,用sys.path.append将路径加载到环境变量里,如果模块是在工作目录的父目录里,就先获取该模块的地址
import sys,os
dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
然后再把它加载到环境变量里
sys.path.append(dir_path)
如果是父目录下的某个子文件夹下的文件夹里,就要把该文件夹的绝对路径加载到sys.path里。
三.导入的优化
1.模块在导入的时候只要模块相同,不管导入了几次只执行一次,所以在导入的时候如果用了这种方式
import test
test.fun1()
test.fun2()
在执行这样的代码时,先加载了test,然后每次调用都是先遍历test,效率相对来说会比较低,可以用from。。。import的方式,直接导入
from test import fun1,fun2
fun1()
fun2()
在调用的时候效率能相对高一点点!
2.由于导入的时候是从前往后遍历sys.path这个列表的,其实为了增加效率,其实不应该用append,而应该用insert,插入列表的第一位,就会增加遍历的速度。
sys.path.append(dir_path)
然后直接用导入包的方法导入就可以了
python之模块的导入的更多相关文章
- python与模块的导入方式
今日所得 模块 import from...import... 循环导入 相对导入 绝对导入 软件开发目录规范 模块 模块:是一系列功能的集合体 模块的三种来源:1.内置模块(Python解释器自带的 ...
- 17.python自定义模块的导入方式
1.直接用import导入 最后运行main.py可以看到命令行窗口输出了一句:你好,这样就完成了. 2.通过sys模块导入自定义模块的路径path 3.在环境变量中找到自定义模块 这个方法原理就是利 ...
- python第三方模块的导入
模块搜索路径 当我们尝试加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错: >>> import module1 Traceback (most ...
- python 浅析模块,包及其相关用法
今天买了一本关于模块的书,说实话,模块真的太多了,小编许多也不知道,要是把模块全讲完,可能得出本书了,所以小编在自己有限的能力范围内在这里浅析一下自己的见解,同时讲讲几个常用的模块. 这里是2018. ...
- 万恶之源 - Python 自定义模块
自定义模块 我们今天来学习一下自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块啊 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组 ...
- Python自定义模块
自定义模块 自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组织结构要好,代码不冗 ...
- python模块以及导入出现ImportError: No module named 'xxx'问题
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...
- 浅谈python模块的导入操作
1.什么是模块 在Python中有一个概念叫做模块(module). 所谓模块,就是将代码量较大的程序分割成多个有组织的,彼此独立但双能互相交互的代码片段, 这些自我包含的有组织的代码段就是模块. 2 ...
- python的模块与包的导入
类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...
随机推荐
- cookie and sesssion
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 基于CentOS搭建个人Leanote云笔记本
Leanote 依赖 MongoDB 作为数据存储,下面开始安装MongoDB: 1. 下载启动 MongoDB 下载 MongoDB 进入 /home 目录,并下载 MongoDB: cd /hom ...
- mybatis的动态sql编写以及一对一关系查询和一对多的查询
创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis **************** ...
- 换上 SansForgetica-Regular 字体,增加记忆能力
最近澳大利亚的RMIT(皇家墨尔本理工大学) 搞出来这么个字体,号称能增强记忆,原理是通过难以识别的字体,让人提起精神去识别,从而记忆更深刻. 果断弄了个试试. 安装过程: 下载字体文件 点这里去下载 ...
- 九、非主体机构元素——header元素、footer元素、address元素、网页编排
header元素 一般用来放置整个页面的标题,比如说一个新闻页面,header一般放新闻的标题,如果是一个官方网址,一般header用来放logo和网站导航. <!DOCTYPE html> ...
- windows下安装Scrapy框架
一 首先我们通过pycharm安装: 发现不行,会报错. 二 通过命令行再次进行安装: 发现还是会报错: 更新下pip,继续安装,发现还是不行,那怎么办呢? 继续安装Scrapy发下还是不行: 那么我 ...
- Vue组件间的参数传递
1.父组件与子组件传值 父组件传给子组件:子组件通过props方法接受数据: 子组件传给父组件: $emit 方法传递参数 2.非父子组件间的数据传递,兄弟组件传值 eventBus,就是创建一个事件 ...
- 201772020113 李清华《面向对象程序设计(java)》第三周学习总结
一.测试题反思: 这次的测试题暴露出我在学习上的很多问题:首先,编程能力非常薄弱,编程题目只写出了第一个程序,还因为小问题通不过测试,以后一定要多上手练习,多阅读示例程序.其次,对理论知识的掌握不全面 ...
- 4-29 c语言之栈,队列,双向链表
今天学习了数据结构中栈,队列的知识 相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO). 首先看一下栈(St ...
- 早期自学jQuery-一入门
本节目录: ----------①安装使用 ----------②语法 ----------③文档就绪函数 ----------④选择器 一.安装使用(特别注意jQuery应当位于<head&g ...