zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/gsblog/p/4030852.html
Copyright © 2011-2022 走看看