1、以HOME目录为准,进行跳转
sys.path.append(os.path.dirname(__file__) + os.sep + ‘../‘) from config import swordfishconf from utils import log from utils.mysql_base import MySQLBase
将程序的HOME目录添加到sys.path中,然后以此为准,进行跳转。
例子中对于封装的MySQLBase类访问是先访问utils包,然后从mysql_base.py中找到MySQLBase类
缺点:查看代码的时候当前脚本和包的关系不十分明了,需要调到HOME,然后再从HOME进行逐个查找
问题:如何直接看出当前脚本和包的关系,而不是经过HOME
2、使用absolute_path
配置PYTHONPATH:
export PYTHONPATH=/data1/guosong/opdir/20141017/test:$PYTHONPATH
代码示例:
. |-- __init__.py |-- lib | |-- __init__.py | |-- pack1 | | |-- __init__.py | | |-- a.py | | `-- aa.py | `-- pack2 | |-- __init__.py | |-- b.py |-- test.py
test.py的代码如下:
[[email protected] ice_test_m test]# more test.py #!/usr/bin/env python2.7 #-*- coding:utf8 -*- from __future__ import absolute_import from lib.pack1.a import AObject if __name__ == ‘__main__‘: AObject.printword()
从lib.pack1.a中引用类AObject,调用它的静态方法
a.py内容:
[[email protected] ice_test_m pack1]# more a.py #!/usr/bin/env python2.7 #-* coding:utf8 -*- from __future__ import absolute_import #from .a import BObject from ..pack2.b import BObject class AObject(object): @classmethod def printword(self): b = BObject(‘a call b class‘)
a.py中又调用上一次目录pack2.b中的BObject
b.py内容为:
[[email protected] ice_test_m pack2]# more b.py #!/usr/bin/env python2.7 #-* coding:utf8 -*- #from __future__ import absolute_import class BObject(object): def __init__(self,bstr): print "B:%s" % bstr
好处:不用再经过HOME,直接根据相对路径进行跳转
3、absolute_path介绍
4、使用absolute_path遇到的问题
4.1、ValueError: Attempted relative import in non-package
4.2、 ValueError: Attempted relative import beyond toplevel package
【参考资料】
1、http://blog.csdn.net/chinaren0001/article/details/7338041
时间: 2024-10-15 03:53:35