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内容都一样, 如下:

#!/usr/bin/python2.7
#-*- coding: UTF-8 -*-
#######################################################################
import os, sys, inspect

def script_abspath(frame=inspect.currentframe()):
    p = os.path.split(inspect.getfile( frame ))[0]
    absdir = os.path.realpath(os.path.abspath(p))
    return absdir

def script_abspath_parent(frame=inspect.currentframe()):
    return os.path.dirname(script_abspath(frame))

def include_dir(subdir=None, frame=inspect.currentframe()):
    # NOTES:
    # DO NOT USE __file__ !!!
    # dir = os.path.dirname(os.path.abspath(__file__))
    # __file__ fails if script is called in different ways on Windows
    # __file__ fails if someone does os.chdir() before
    # sys.argv[0] also fails because it doesn't not always contains
    #   the path
    #
    # realpath() will make your script run, even if you symlink it
    p = os.path.split(inspect.getfile( frame ))[0]
    incdir = os.path.realpath(os.path.abspath(p))
    if incdir not in sys.path:
        sys.path.insert(0, incdir)
    if subdir:
        # use this if you want to include modules from a subfolder
        incdir = os.path.realpath(os.path.abspath(os.path.join(p, subdir)))
        if incdir not in sys.path:
            sys.path.insert(0, incdir)

###########################################################
# include dir and parent dirs
absdir = script_abspath()

while os.path.isdir(absdir):
    pkgini = os.path.join(absdir, "__init__.py")

    if not os.path.exists(pkgini):
        break

    if os.path.isdir(pkgini):
        break

    include_dir(absdir)

    absdir = os.path.dirname(absdir)

a.py 如下:

#!/usr/bin/python2.7
#-*- coding: UTF-8 -*-
#

import common

import utils.util
import utils.log
...

test.py 也一样:

#!/usr/bin/python2.7
#-*- coding: UTF-8 -*-
#

import common

import utils.util
import utils.log

import plugins.mail
 ...

就这么简单.

__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. Excel实现双击插入当前日期时间

    用vba做一个事件驱动程序. 第一步:点击开发工具-visual basic. 第二步:在当前工作表中编制程序如下: Private Sub Worksheet_BeforeDoubleClick(B ...

  2. Java文件操作(新建,遍历,删除)

    //创建文件 private static void createFile(File file){ try { if(!file.exists()){ if(file.getParentFile() ...

  3. python中模块,包,库的概念

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  4. Linux学习之CentOS(十一)-----Linux 账号管理(转)

    Linux 账号管理(转) useraddpasswdchageusermoduserdelfingerchfnchshidgroupaddgroupmodgroupdelgpasswd su(帐号切 ...

  5. Spring利用反射调用接口

    首先在项目中使用java反射调用 //根据实例及参数名获得方法A Method method = event.getObj().getClass() .getMethod(event.getMetho ...

  6. 整理spring定时器corn表达式

    1.结构 corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份 2.各字段的含义   字段 允许值 允许的特殊字符 秒 0~59 - * / 分 0~59 - * / ...

  7. spring boot+mybaits+mysql+generato(逆向工程)+前后台数据交互

    如按照我博客上没有弄出来 请在下面留言 我好修改 谢谢 小弟使用的是Eclipse 首先下载STS插件 help--->Elipse Marketplace--->find搜索栏里面搜索S ...

  8. Node.js 实用工具

    稳定性: 4 - 锁定 这些函数都在'util' 模块里.使用 require('util') 来访问他们. util 模块原先设计的初衷是用来支持 node 的内部 API 的.这里的很多的函数对你 ...

  9. C/C++ 函数指针

    函数声明 例如: float func(int, int); 以上就是一个函数的声明,要注意它的实际功能并没有被实现,换句话说就是它并没有被定义,只是声明此函数的存在.要想调用次函数,你必须对对此函数 ...

  10. 微信小程序基础之开源项目库汇总

    awesome-github-wechat-weapp 是由OpenDigg整理并维护的微信小程序开源项目库集合.我们会定期同步OpenDigg上的项目到这里,也欢迎各位提交项目给我们. (链接:ht ...