python 引入文件 2.7 和3.6 form import 和 import 附录azkaban调用项目中 py文件的例子

本文深入探讨了Python中模块和包的基本概念,包括它们的定义、创建和使用方法。同时,详细对比了Python2和Python3中模块导入的差异,以及绝对导入与相对导入的区别。此外,还提供了实用的代码示例,帮助读者更好地理解和运用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 模块和包的概念
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值