【大数据课堂0003】【import】__file__ 作用以及模块导入方法

摘要:
import导入模块,就是能够根据sys.path环境变量的值,找到具体模块的路径。既然这样,要import上一级目录的module,可以sys.path.insert。__file__:当前执行的文件,不带路径,除非自己带路径。解决循环import的问题:A中导入B,B也需要A中内容。解决循环import的方法主要有几种。分离的话就是把需要import的资源提取到一个第三方文件去。_init__.py文件:__init__.py控制着包的导入行为。__init__.py中还有一个重要的变量,叫做__all__。

【原理】import 导入模块,就是能够根据sys.path环境变量的值,找到具体模块的路径。

import上一级目录的模块===>

sys.path.insert(0,'../') #最简洁做法

python 执行py 文件的时候,默认就会把当前目录增加到sys.path中。sys.path[0]。

– src 
  |– mod1.py 
  |– test1.py

test1.py中导入模块mod1, 则直接使用
import mod1 或 from mod1 import *
– src 
|– mod1.py 
|– mod2 
  |– mod2.py 
– test1.py

from mod2.mod2 import * 或 import mod2.mod2.
– src 
  |– mod1.py 
  |– mod2 
   |– mod2.py 
  |– sub 
    |– test2.py 
  – test1.py 

#test2.py 调用模块
importsys 
sys.path.insert(0,'../')# 简洁 ..==../
#parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#
sys.path.insert(0,parentdir)
importmod1
import mod2.mod2

python中,import module会去sys.path搜索,sys.path是个列表,并且我们可以动态修改。

要import某个目录的module,我们sys.path.insert(0,somedir)来加入搜索路径,就可以import了。
既然这样,要import上一级目录的module,可以sys.path.insert(0,parentdir)。
不过这种写绝对路径的方式,如果文件放到其它地方,就不行了。
所以用动态方法来获取上一级目录。当前文件执行的目录的路径就加入到python 路径里面,后面不管你目录移动到什么位置,里面的文件都能执行。

__file__:当前执行的文件,不带路径,除非自己带路径。Python a.py __file__==a.py ; python D:/b.py __file__==D:/b.py
importos,sys 
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
sys.path.insert(0,parentdir)

为什么用sys.path.insert(0,parentdir) 而不是用sys.path.append(parentdir)呢
因为是遍历搜索路径的,所以如果在其它路径里也有个同名的module,会import错。用sys.path.insert(0,parentdir)可以确保先搜索这个路径;2,自定义的优先级要高,保证优先搜到。

解决循环import的问题: A中导入B ,B 也需要A中内容。----理顺逻辑,组织代码

# 不能逻辑不清晰,循环死调用,a里调b b里有调a

在python中常常会遇到循环import即circular import的问题。
现实中经常出现这种滑稽的情况,
安装无线网卡的时候,需要上网下载网卡驱动..

这样就产生了循环import的问题。
解决循环import的方法主要有几种。
1.延迟导入(lazy import)
即把import语句写在方法或函数里面,将它的作用域限制在局部。
这种方法的缺点就是会有性能问题。
2.将from xxx import yyy改成import xxx;xxx.yyy来访问的形式
3.组织代码
出现循环import的问题往往意味着代码的布局有问题。
可以合并或者分离竞争资源。
合并的话就是都写到一个文件里面去。
分离的话就是把需要import的资源提取到一个第三方文件去。
总之就是将循环变成单向。

“ / ”:表示根目录,在windows系统下表示某个盘的根目录,如“D:”;

“ ./ ”:表示当前目录;(表示当前目录时,也可以去掉“./”,直接写文件名或者下级目录)

“ ../ ”:表示上级目录。

原理:

原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从xml导入dom)的时候,实际上导入了它的__init__.py文件。

一个包是一个带有特殊文件__init__.py的目录。__init__.py文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果__init__.py不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

_init__.py 文件:

__init__.py 控制着包的导入行为。假如 __init__.py 为空,那么仅仅导入包是什么都做不了的。

__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:

from PackageName import *

这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:

#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

__init__.py 文件会在导入时被执行。

免责声明:文章转载自《【大数据课堂0003】【import】__file__ 作用以及模块导入方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu下linux内核源码阅读工具和调试方法总结高中生该如何申请美国大学?不妨看一下下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python 把数据 json格式输出

有个要求需要在python的标准输出时候显示json格式数据,如果缩进显示查看数据效果会很好,这里使用json的包会有很多操作 import json date = {u'versions': [{u'status': u'CURRENT', u'id': u'v2.3', u'links': [{u'href': u'http://controll...

聊聊 Python 数据处理全家桶(Sqlite篇)

1. 前言 上篇文章 聊到 Python 处理 Mysql 数据库最常见的两种方式,本篇文章继续说另外一种比较常用的数据库:Sqlite Sqlite 是一种 嵌入式数据库,数据库就是一个文件,体积很小,底层由 C 语言编写,经常被集成到移动应用程序中 事实上,Python 内置了 sqlite3 模块,不需要安装任何依赖,就可以直接操作 Sqlite...

常见网页错误400/401/403/404/500网页错误代码表示的含义

转载:http://blog.csdn.net/yanchao315/article/details/76686827 HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。 HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证书与登录服务器所需的证书不匹配。 请与...

MoveIt 仿真 Gazebe 教程学习(五)

MoveIt 仿真 Gazebe 教程学习(五)  【古月居】 ROS探索总结(五)——创建简单的机器人模型smartcar,网址如下: https://www.guyuehome.com/243 还有相关的一系列文章都可以看看。 前提: 源码地址:https://github.com/huchunxu/ros_exploring 需要把里面的 ROS2...

python 反射

import timesss##反射:根据字符串的形式去对象(模块)中操作其成员(查找/获取/删除/添加)#根据用户输入内容,导入模块(字符串形式导入模块) inp = input("请输入模块名:") res = __import__(inp) uu = res.md5("123456") print(uu) #字符串方式去模块中查找函数,并执行# g...

【Python】爬取百度图片

所需要导入的包:BeautifulSoup:该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。这里是用来获取一个页面里面的各个标签及里面的内容,我们主要用到它里面的find(),find_All()函数requests:是用来获取网页信息的,也就是...