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

Python的路径引用的更多相关文章

  1. [项目实践] python文件路径引用的规则,记一次使用sys.path[0]的问题,及如何区分 ../与 ./的使用场景

    下面是一个获取配置的代码 def getValue(self,section,option): """ @file: string,the name of the con ...

  2. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  3. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  4. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  5. python中的引用

    作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...

  6. 用绝对路径引用JS、CSS

    项目中,最好使用绝对路径引用JS和CSS文件,详情如下: 1.vm文件中: <link rel="stylesheet" href="$!{request.cont ...

  7. Python之路【第二十四篇】:Python学习路径及练手项目合集

      Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...

  8. Python中的引用的使用注意

    关于Python中的引用的一些使用注意 在python中,在创建一个对象并给它赋予一个变量时,这个赋予的变量仅仅是一个引用它所代表的对象.也就是说新创建的对象只是指向计算机中储存那个对象的内存. 比如 ...

  9. python的计数引用分析(一)

    python的垃圾回收采用的是引用计数机制为主和分代回收机制为辅的结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外.(默认对象的引用计数永远不会变成0) 所有的计数引用+1 ...

随机推荐

  1. html阶段测试

    1.简述src和href的区别? 2.在html页面的head中定义属性<meta http-equiv="X-UA-Compatible" content="IE ...

  2. 执行Sqlserver中waitfor delay延时操作或waitfor time定时操作

    private static string connectionString = RBAC.Dal.DataRootBase.ConnectionString; private SqlConnecti ...

  3. scala 读取文件遇到encode问题(Mac -> remote Linux)

    Source.fromFile(fileName)(enc: Encode),如果遇到错误: java.nio.charset.MalformedInputException: Input lengt ...

  4. JAVA基础总结2

    2.1 关键字 常用的关键字主要包括如下: 2.2 标识符 简单而言标识符它其实就是用于标识某些东西的符号. 2.3 注释的应用 注释说明 注释的作用: 注释的应用: 2.4 常量和变量 常量的定义与 ...

  5. ubuntu6.04下安装Eclipse for C/C++ Development

    ubuntu6.04下安装Eclipse for C/C++ Development 首先安装gcc/g++ 需要安装jdk,有的可以尝试安装openjdk. sudo apt-get install ...

  6. python 目录文件

    每天写一点,总有一天我这条咸鱼能变得更咸 python 中对文件及目录的操作基本依赖与os,shutil模块,其中以os模块为主,最主要的几个方法实例如下: 1.判断文件/目录是否存在(os.path ...

  7. vue——实例方法 / 数据

    目录 1.vm.$set 2.vm.$watch 3.vm.$delete 1.vm.$set 哎呀呀,周五啦,大家应该都很开心吧,放假了可以好好休息休息啦,然而小颖明天要面试,所以小颖今天就回去放了 ...

  8. 简易RPC框架-客户端限流配置

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  9. JqueryMobile基础之创建页面

    首先简答介绍一下JQueryMobile吧,我觉得用一句话来讲就是可以 "写更少的代码,做更多的事情" : 它可以通过一个灵活及简单的方式来布局网页,且兼容所有移动设备.这也是我自 ...

  10. Java基础总结--面向对象2

    1.存在相关的多个方法就封装在一个类中,方法没调用到特有数据,需要静态化2.假如一个类所有方法都是静态方法,为了保证不被其他创建对象,可以将该类的构造方法私有化3.文档注释javadoc-按照规定注释 ...