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. Linux上mysql的安装与配置

    前言 在我们使用Linux的过程中,可能会使用到数据库.那么,数据库的安装与配置就是我们需要掌握的了~所以呢,这篇博客小编就来给大家唠唠数据库的安装与配置. 说到编译安装,小编脑海里浮现的第一个方法就 ...

  2. Pyquery API中文版

    Pyquery的用法与jQuery相同,可以直接参考jQuery API学习.

  3. Android模拟器检测常用方法

    在Android开发过程中,防作弊一直是老生常谈的问题,而模拟器的检测往往是防作弊中的重要一环,接下来有关于模拟器的检测方法,和大家进行一个简单的分享. 1.传统的检测方法. 传统的检测方法主要是对模 ...

  4. Ubuntu 中登录相关的日志

    登录相关的日志涉及到系统的安全,所以是系统管理中非常重要的一部分内容.本文试图对登录相关的日志做一个整理. /var/log/auth.log 这是一个文本文件,记录了所有和用户认证相关的日志.无论是 ...

  5. 虚拟机VMware-workstation-full-12.5.2安装注册方法(附安装包下载链接)

    首先,需要下载好虚拟机的安装包: 链接:http://pan.baidu.com/s/1mix3fFa 密码:6ftu 下载好后,双击安装程序,弹出安装界面,然后按照红色圈圈的指示进行安装操作,完成安 ...

  6. 【转】认识物理I/O构件- 主机I/O总线

    在数据离开系统内存总线后,它通常传输到另一条总线,即主机I/O总线.在今天的产品中,最常见的主机I/O总线是PCI总线,但也存在着几种其他的总线,如S -总线,EIS A总线及VME总线.主机I/O总 ...

  7. C++点滴20130724

    warning c4627:"#include stdafx.h":在查找预编译头使用时跳过 原因: 1.没有添加 #include "stdafx.h" 2. ...

  8. dubbo 笔记-XML配置文件简介

    <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心. eg.<dubbo:service r ...

  9. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  10. 100. Same Tree(leetcode)

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...