python 子包引用父包和其他子包

python引用子目录很简单, 里面放个__init__.py就可以了. 如何在子目录里面引用其他目录(父目录,爷目录和同辈分目录)呢?

例如: python有项目目录结构:

projectdir/

------------------  __init__.py

| ----------------- core/

|----------------- __init__.py

|---------------- a.py

|----------------- b.py

|----------------- common.py

|------------------ subcore/

|-------------------- __init__.py

|-------------------- common.py

|-------------------- test.py

|------------------- plugins/

|------------------- __init__.py

|------------------- mail.py

|------------------- tel.py

|----------------- common.py

|------------------- utils/

|------------------- __init__.py

|------------------- util.py

|-------------------- log.py

1) 现在 a.py要import util和log, 如何实现呢? 很简单, 所有的common.py内容都一样, 如下:

  1. #!/usr/bin/python2.7
  2. #-*- coding: UTF-8 -*-
  3. #######################################################################
  4. import os, sys, inspect
  5.  
  6. def script_abspath(frame=inspect.currentframe()):
  7. p = os.path.split(inspect.getfile( frame ))[0]
  8. absdir = os.path.realpath(os.path.abspath(p))
  9. return absdir
  10.  
  11. def script_abspath_parent(frame=inspect.currentframe()):
  12. return os.path.dirname(script_abspath(frame))
  13.  
  14. def include_dir(subdir=None, frame=inspect.currentframe()):
  15. # NOTES:
  16. # DO NOT USE __file__ !!!
  17. # dir = os.path.dirname(os.path.abspath(__file__))
  18. # __file__ fails if script is called in different ways on Windows
  19. # __file__ fails if someone does os.chdir() before
  20. # sys.argv[0] also fails because it doesn't not always contains
  21. # the path
  22. #
  23. # realpath() will make your script run, even if you symlink it
  24. p = os.path.split(inspect.getfile( frame ))[0]
  25. incdir = os.path.realpath(os.path.abspath(p))
  26. if incdir not in sys.path:
  27. sys.path.insert(0, incdir)
  28. if subdir:
  29. # use this if you want to include modules from a subfolder
  30. incdir = os.path.realpath(os.path.abspath(os.path.join(p, subdir)))
  31. if incdir not in sys.path:
  32. sys.path.insert(0, incdir)
  33.  
  34. ###########################################################
  35. # include dir and parent dirs
  36. absdir = script_abspath()
  37.  
  38. while os.path.isdir(absdir):
  39. pkgini = os.path.join(absdir, "__init__.py")
  40.  
  41. if not os.path.exists(pkgini):
  42. break
  43.  
  44. if os.path.isdir(pkgini):
  45. break
  46.  
  47. include_dir(absdir)
  48.  
  49. absdir = os.path.dirname(absdir)

a.py 如下:

  1. #!/usr/bin/python2.7
  2. #-*- coding: UTF-8 -*-
  3. #
  4. import common
  5. import utils.util
  6. import utils.log
  7. ...

test.py 也一样:

  1. #!/usr/bin/python2.7
  2. #-*- coding: UTF-8 -*-
  3. #
  4.  
  5. import common
  6.  
  7. import utils.util
  8. import utils.log
  9.  
  10. import plugins.mail
  11. ...

就这么简单.

__init__.py是空文件.

python 子包引用父包和其他子包的更多相关文章

  1. iframe子页面调用父页面javascript函数的方法

    1.iframe子页面调用 父页面js函数 子页面调用父页面函数只需要写上window.parent就可以了.比如调用a()函数,就写成: window.parent.a(); 2.iframe父页面 ...

  2. Vue 组件&组件之间的通信 之 子组件向父组件传值

    子组件向父组件传值:子组件通过$.emit()方法以事件形式向父组件发送消息传值: 使用步骤: 定义组件:现有自定义组件com-a.com-b,com-a是com-b的父组件: 准备获取数据:父组件c ...

  3. angular4父组件向子组件传值,子组件向父组件传值的方法

    父组件向子组件传值   @Input 文件目录 父组件: father.template.html <h1>父组件</h1> <cmt-child [data]='dat ...

  4. Vue_(组件通讯)子组件向父组件传值

    Vue组件 传送门 子组件向父组件传值:子组件通过$.emit()方法以事件形式向父组件发送消息传值: 使用步骤: 1.定义组件:现有自定义组件com-a.com-b,com-a是com-b的父组件: ...

  5. js 父子标签同时设置onclick,子标签触发父标签onclick解决办法

    js 父子标签同时设置onclick,子标签触发父标签onclick 或 子标签为a 先触发onclick 再触发 a 的 href: 解决方案:在子标签的onclick里写 var ev = win ...

  6. [Dynamic Language] Python非子包引用

    Python非子包引用 python的搜索路径其实是一个列表(sys.path) 导入模块时python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功. 在项目中如果要引用 ...

  7. [原创]SSIS-执行包任务调用子包且子包读取父包变量

    背景:       有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的E ...

  8. 【原创】SSIS-执行包任务调用子包且子包读取父包变量

    背景: 有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的ETL包,此时 ...

  9. go语言包与包引用

    go语言中包(package)与java中的包(package)非常类似,都是组织代码的方式,而且都和磁盘上的目录结构存在对应关系. go语言中,包名一般为go代码所在的目录名,但是与java不同的是 ...

随机推荐

  1. 2015 多校联赛 ——HDU5323(搜索)

    Solve this interesting problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  2. centos下 apache+mysql+php的安装

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  3. jqGrid移动滑块时冻结首列和第二列例子

    js代码如以下代码:在initAllGrid函数colModel1加入属性设置:frozen:true:然后在_initGrid('task_con_grid_div',colModel1)函数里面加 ...

  4. 你知道src、url、href的全称吗?

    url:Uniform Resource Locator统一资源定位符 src:Source资源 href:Hypertext Reference超文本引用

  5. Jmeter_ForEach控制器实现网页爬虫

    一直以来,爬虫似乎都是写代码去实现的,今天像大家介绍一下Jmeter如何实现一个网页爬虫! Jmeter的爬虫原理其实很简单,就是对网页提交一个请求,然后把返回的所有href提取出来,利用ForEac ...

  6. popen() 使用举例 (转载)

    函数原型: #include "stdio.h" FILE *popen( const char* command, const char* mode ) 参数说明: comman ...

  7. Node.js 网络

    稳定性: 3 - 稳定 net 模块提供了异步网络封装,它包含了创建服务器/客户端的方法(调用 streams).可以通过调用 require('net') 包含这个模块. net.createSer ...

  8. Python3 SMTP发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...

  9. [LaTeX] box algorithm adjustbox subfigures, textwidth

    algorithm \begin{figure}[!t] \vspace*{\dimexpr\fboxsep+\fboxrule} \fbox{% \parbox{\dimexpr\linewidth ...

  10. 集群技术(二) MySQL集群简介与配置详解

    when?why? 用MySQL集群? 减少数据中心结点压力和大数据量处理(读写分离),采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据 ...