python 不一样包间模块引用

python 

 python 类,模块,包

Python在处理功能复用和功能颗粒度划分时采用了类、模块、包的结构。 python

类:类的概念在许多语言中出现,很容易理解。它将数据和操做进行封装,以便未来的复用。类写在模块里。 app

模块:一般是一个python文件,定义了某些函数和变量。你在其余须要这些功能的文件中,导入这模块,就可重用这些函数和变量。通常用module_name.fun_name,和module_name.var_name进行使用。 函数

包:包对应于文件夹,包含许多模块。咱们通常将某些功能相近的模块放在同一个包中。使用包的方式跟模块也相似,惟一须要注意的是,当文件夹看成包使用时,文件夹须要包含__init__.py文件,主要是为了不将文件夹名看成普通的字符串。__init__.py的内容能够为空,通常用来进行包的某些初始化工做或者设置__all__值,__all__是在from package-name import *这语句使用的,所有导出定义过的模块。 this

不一样包间类,函数,变量的引用

目录以下:

work:#工做目录
    package1
        __init__.py
        module1.py
            func1()
    package2
        __init__.py
        module2.py
            func2()
    main.py
        main()#主程序

(1) 在module1中调用module2中的func2

     首先须要找到module2,用以下代码声明mudule2路径(实际上是将mudule2路径加入到sys.path中): spa

#__init__.py

import os
import sys
sys.path.append(os.getcwd()+"\\package2\\module2")
    此时,能够在module1中调用func2:
#module.py

from package2.module2 import func2

def func1():
    func2()
    print "This is func1"
    ...
注意:此时运行module1会报错,若查看sys.path可看到咱们添加的路径变为..\working\package1\package2\module2,显然,这个路径并非module2的路径,原来错误在这里,那么到底怎么回事呢?记得os.getcwd()吗,它是返回当前运行模块所在目录,而咱们运行mudule1,所以...

(2) 在main.py中调用func1:

# main.py
from package1.module1 import func1

def main():
    func1()

if __name__ == "__main__":
    main()
注意:i) 此时从main.py调用func1,并无事先声明module1的路径

        ii) 运行main.py, 你猜,程序可以正确运行么?没错,此时,能够获得正确的输出。 code

#假如 func2 的功能是打印一条 “this is func2”

#输出以下:

This is func2
This is func1

方法(2)

不须要添加路径,利用__all__,参考博文 字符串

具体操做为,在每一个包的__init__.py文件中用__all__指定要引用的模块。如: get

# package1\__init__.py
__all__=["module1"]

#package2\__init__.py
__all__=["module2"]
相关文章
相关标签/搜索