0
点赞
收藏
分享

微信扫一扫

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


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是空文件.



举报

相关推荐

0 条评论