一 模块和包的概念
1.module
A module is a file containing Python definitions and statements.
所以module就是一个.py文件
2.package
Packages are a way of structuring Python’s module namespace by using “dotted module names”
The init.py files are required to make Python treat the directories as containing packages;
所以package就是一个包含.py文件的文件夹,文件夹中还包含一个特殊文件__.init__.py
二. import和from import的支持用法
import package1 #✅
import module #✅
from module import function #✅
from package1 import module #✅
from package1.package2 import #✅
import module.function1 #❌
定义个模块
#!/usr/bin/env python
coding=utf-8
Filename: mymodule.py
def sayhi():
print ‘Hi this is mymodule speaking’
version=‘1.0’
引用两种方式
#!/usr/bin/env python
coding=utf-8
方式一
import mymodule
mymodule.sayhi()
print 'Version ',mymodule.version
#方式二
from mymodule import sayhi,version
sayhi()
print ‘Version’,version
这两种方式都能正常运行,并且结果都一样,
如果使用import的话,就需要使用导入的module名称来引用模块的方法,成员变量了
如果使用from … import 就可以直接使用该模块中的方法 成员变量了
可以类似大概理解为 from … import 是java中的静态导入,而import 语句就是java中的正常导入
适用范围
from math import sqrt
def sqrt(n):
return n
print sqrt(13689)
raw_input()
运行py文件输出13689,所以自己定义了函数会自动屏蔽掉
注::建议 在本文件和引入文件具有相同的方法时建议用import math.* 方法,用from math import *容易出错
但是在,用到很少的函数且次数较多时上面这种办法会比较合适(form math import sqrl )方式。
三 python 2 和python3 引入model的不同
python3.x之后,在包内的模块导入有了新的变化。官方的说法就是在包内的模块导入,默认由原来的相对导入变成绝对导入。
普通文件
import string
1、 主目录(也就是当前目录)
2、系统环境变量
3、标准库
4、前三个在搜索路径下的 .pth文件
python 2.x在包内模块的导入,顺序是:
1、当前目录
2、上一个目录
3、找不到再往上
4、系统环境变量
5、标准库
6、前三个在搜索路径下的 .pth文件
这种方式叫做相对导入。
而 python3.x 中的包内的模块导入原则编程了:
(1)默认绝对导入
(2)如果要相对导入,那么一定是显式声明,并且,这个声明不是告诉python一个模块查找偏好,而是一种约束(也就是说,一旦声明,必须是相对导入)
现在将一下什么是绝对导入,什么是相对导入。
绝对导入:跳过包内,直接搜索 sys.path ,在sys.path的基础上进行我们的模块搜索。
相对导入:先包内,再包外,再,,,
举个例子:
/test/pkg/init.py
/test/string.py
print “/test/string.py”
/test/pkg/eggs.py
import string
/test/pkg/string.py
print “/test/pkg/string.py”
就拿上面的目录架构来讲。
如果在python2.x里,我们运行eggs.py的结果是:
/test/pkg/string.py
如果在python3.x里,我们运行eggs.py的结果是:/test/string.py
为什么会这样?
因为在python3.x 里查找string.py的时候,直接是跳过了本包,而去sys.path 里查找这个名字的包。
那么我们就要知道这个sys.path是什么值?
在我的linux电脑主目录有一个test.py文件
liqing@ya ~ $ python test.py
0 /home/liqing
1 /usr/local/lib/python2.7/dist-packages/pyOpenSSL-0.14-py2.7.egg
2 /usr/local/lib/python2.7/dist-packages/six-1.6.1-py2.7.egg
上面的结果是我的一个在linux系统主目录下.py文件打印sys.path的结果,
我们看到文件所在的当前目录是sys.path的第一个,也就是先搜索当前文件所在目录。
等等等等,那如果是这样,也就是说无论在python2.x和python3.x中都是先从当前文件目录搜索,
那么,先前举得例子结果都应该是
/test/pkg/string.py
这里请注意,绝对导入的意思是:跳过当前包,然后sys.path搜索。
一句话总结就是:
python3.x删除了 2.x在包内的特殊搜索。
**注 python3.x 如果要相对导入,必须使用from语法显式声明,这样减少了导入过程的歧义,并能明确的制定是在path搜索,还是在本包中相对导入。
python 3.6 项目中azkaban通过脚本调用例子(测试可行)
此处应用 from import
在此文件中 调用lib包下 utils 模块的 suppress_exception 方法
然后在job 文件中 调用方式问
bash -c ". ./CONSTANT.sh; PYTHONPATH=./report_framework /home/hdfs/zhaolc/.py3/bin/python ./report_framework/apps/generate_report.py --report finance_monthly_report;
调用参数
此种方式调用 在上传linux 下 就能找到相关的 py 文件中彼此的引用情况
参考:https://blog.youkuaiyun.com/qiya2007/article/details/24265447