• Python的路径引用


    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的代码如下:

    [root@typhoeus79 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内容:

    [root@typhoeus79 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内容为:

    [root@typhoeus79 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

    包含相对路径import 的python脚本不能直接运行,只能作为module被引用。原因正如手册中描述的,所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“__main__”, 而不是module原来的name, 这样相对路径也就不是原来的相对路径了,导入就会失败,出现错误“ValueError: Attempted relative import in non-package”

    Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always"__main__", modules intended for use as the main module of a Python application should always use absolute imports.

    在使用相对引用的文件中,不能有__main__方法,只执行作为一个module进行引用,而不是直接执行脚本。


    4.2、 ValueError: Attempted relative import beyond toplevel package

    test.py内容:

    [root@typhoeus79 ice_test_m test]# more test.py
    #!/usr/bin/env python2.7
    #-*- coding:utf8 -*-
    
    from __future__ import absolute_import
    
    
    from pack1.a import AObject
    from pack1.a import now
    
    if __name__ == '__main__':
        AObject.printword()
        print now
    

    其他均不变,但是将pack2和pack1的包迁移到外面出

    .
    |-- __init__.py
    |-- lib
    |   |-- __init__.py
    |-- pack1
    |   |-- __init__.py
    |   |-- a.py
    |   `-- aa.py
    |-- pack2
    |   |-- __init__.py
    |   |-- b.py
    |-- test.py
    

    运行test.py出错:

    [root@typhoeus79 ice_test_m test]# ./test.py 
    Traceback (most recent call last):
      File "./test.py", line 7, in <module>
        from pack1.a import AObject
      File "/data1/guosong/opdir/20141017/test/pack1/a.py", line 6, in <module>
        from ..pack2.b import BObject
    ValueError: Attempted relative import beyond toplevel package
    

      

    处理方式是创建一个lib目录,将pack1和pack2拉到lib下面,修改test.py中的路径然后就ok了。


    【参考资料】

    1、http://blog.csdn.net/chinaren0001/article/details/7338041

    2、http://hi.baidu.com/fleago/item/06b5c95765b17e12aaf6d79b

  • 相关阅读:
    5.Spring高级装配(根据profile的激活状态决定使用的环境) 以及 条件化 Bean
    4.SpringJunit4ClassRunner
    3.Spring配置可选方案
    2.Spring容器bean的生命周期
    1.使用spring上下文容纳你的Bean
    maven 打包跳过 Junit test
    HTML5中meta name="viewport"
    二、JavaScript this
    VIM_插件
    VBS_DO...Loop
  • 原文地址:https://www.cnblogs.com/gsblog/p/4030852.html
Copyright © 2020-2023  润新知