Python的路径引用

摘要:
/usr/bin/envpython2.7#-*-编码:utf8-*-from__future_importabsolute_importfrom.pack1.aimportAObjectif_name__=='__main__':对象。printword()引用lib.pack1.a中的AObject类,并调用其静态方法.py content:[root@typhoeus79ice_test_mpack1]#更多。py#!/usr/bin/envpython2.7#-*编码:utf8-*-from__future_importabsolute_Import#from。从..Pack2.bimportBObjectclassAObject:@classmethoddefprintword:b=BObjecta导入对象。py调用BObject。py在上一个目录pack2.b中:[root@typhoeus79ice_test_mpack2]#更多。py#!/usr/bin/envpython2.7#-*编码:utf8-*-#from_future_importabsolute_importclassBObject:def__init__:打印“B:%s”%bstr优点:直接根据相对路径跳过,而不是通过HOME 3.绝对路径介绍4.使用绝对路径问题4.1。ValueError:尝试相对路径导入innon包包含相对路径导入的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的路径引用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇async await与async await Task.RunJava NIO 学习笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring Test 整合 JUnit 4 使用总结

转自:https://blog.csdn.net/hgffhh/article/details/83712924 这两天做Web开发,发现通过spring进行对象管理之后,做测试变得复杂了。因为所有的Bean都需要在applicationContext.xml中加载好,之后再通过@Resource去取得。如果每次都要整个业务流做的差不多了再去测试,这样效率...

python测试开发django(8)--django连接mysql

前言 Django对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连mysql需要安装驱动mysqlclient mysqlclient安装 先要安装数据库驱动mysqlclient,使用pip安装就行 pip install...

python 第三方库BeautifulSoup4文档学习(4)

bs4 搜索文档树 搜索文档树有很多方法,比较常用的是find()和find_all() ,在方法中我们通常需要加上特定的参数去查找我们需要的内容,这样的参数就被看作为过滤器。 依然使用官方提供的测试html文档 html_doc = """ <html><head><title>The Dormouse's story...

Oracle实例解析:编码与字符集

字符集:人们根据需要把某些字符收集到一处,并赋以名称,于是便有了某某字符集。 编码:当前面收集的工作完成以后,为了让只认识数字的“愚蠢”的计算机也能够存储字符,人们不得不为集合里的每一个字符分配”身份证号码”,这就是编码,从此,终于可以以存储编码的方式在计算机中存储字符了。 在字符集与编码世界的漫漫历史长河里(伪),出现过若干个让计算机工作者们如雷贯耳的名...

python限制进程、子进程占用内存大小、CPU时间的方法:resource模块

内置模块:resource 在mac环境下功能会存在问题。linux下可以使用:但是for i in range(10000)的值必须是10000或者更大的数值才有用。没有搞清楚为什么 #/usr/bin/env python #-*-coding:utf-8-*- import resource #soft,hard=resource.getrli...

Spark python集成

Spark python集成 1、介绍 Spark支持python语言,对于大量的SQL类型的操作,不需要编译,可以直接提交python文件给spark来运行,因此非常简单方便,但是性能要比scala或java慢。对于常规任务,可以使用python来编写,特殊任务还是建议scala编写。 2、使用pyspark启动spark shell(centos) 2...