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
Python的路径引用的更多相关文章
- [项目实践] python文件路径引用的规则,记一次使用sys.path[0]的问题,及如何区分 ../与 ./的使用场景
下面是一个获取配置的代码 def getValue(self,section,option): """ @file: string,the name of the con ...
- Python的模块引用和查找路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...
- Python学习路径及练手项目合集
Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159
- Python 对象的引用计数和拷贝
Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...
- python中的引用
作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...
- 用绝对路径引用JS、CSS
项目中,最好使用绝对路径引用JS和CSS文件,详情如下: 1.vm文件中: <link rel="stylesheet" href="$!{request.cont ...
- Python之路【第二十四篇】:Python学习路径及练手项目合集
Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...
- Python中的引用的使用注意
关于Python中的引用的一些使用注意 在python中,在创建一个对象并给它赋予一个变量时,这个赋予的变量仅仅是一个引用它所代表的对象.也就是说新创建的对象只是指向计算机中储存那个对象的内存. 比如 ...
- python的计数引用分析(一)
python的垃圾回收采用的是引用计数机制为主和分代回收机制为辅的结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外.(默认对象的引用计数永远不会变成0) 所有的计数引用+1 ...
随机推荐
- 使用siege对web接口进行post方式的压力测试
为了达到压力测试的效果,需要申请一台线上机器,并且安装压力测试的工具siege. 安装新版siege.资料说yum安装的版本2.70对于post方式支持的不好,验证后发现请求可以正常发过去,但是打开d ...
- 使用 Hibernate 和 MySQL 需要知道的五件事
https://www.thoughts-on-java.org/5-things-you-need-to-know-when-using-hibernate-with-mysql/ 作者:Thorb ...
- 【解决方案】客户端请求数据较大时,nginx返回数据被截断
[问题描述]:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据. [问题原因]:nginx配置文件中包含了proxy_buffer_size.pro ...
- ubuntu tftp-server 服务器安装与配置
第一步:安装tftp服务sudo apt-get install tftpd tftp openbsd-inetd第二步:目录配置vi /etc/inetd.conf修改文件夹为根目录下的tftpbo ...
- PHP 单例模式解析和实战
一.什么是单例模式? 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2. ...
- 新型勒索软件Magniber正瞄准韩国、亚太地区开展攻击
近期,有国外研究人员发现了一种新型的勒索软件,并将其命名为Magniber,值得注意的是,这款勒索软只针对韩国及亚太地区的用户开展攻击.该勒索软件是基于Magnitude exploit kit(简称 ...
- Linux入门(13)——Ubuntu16.04下将图片和pdf互转
Ubuntu16.04下将图片和pdf互转 将图片转为PDF: convert 图片 PDF convert pic.jpg pic.pdf 将PDF转为图片: convert PDF 图片 conv ...
- BZOJ-1045-[HAOI2008] 糖果传递(中位数原理)
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...
- node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能
第一章 建议学习时间8小时·分两次学习 总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章]) 视频教程地 ...
- 正确理解Mysql的列索引和多列索引
MySQL数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. CREATE TABLE test ( id INT NOT NULL, last_ ...