在引用自己構造模塊包時,總是不成功
from XXXLib.Pub import *
dumpString("XXXX......")
總是報:NameError: name 'dumpString' is not defined
後來纔想到是沒有引用到具體的模塊:
from XXXLib.Pub.shareDef import *
dumpString("XXXX......")
藉此機會再來回顧一下如何構造自己的模塊包:
首先創建一個Package(我用的是Eclipse IDE)
然後再創建子包,記得用Package.SubPackage的方式命名
然後再創建子包裏的Python模塊,就是一個個py文件
在每個包的下面創建一個空的__init__.py文件,表示該目錄爲python的包
然後就可以在別的py文件中引用包中的函數了,引用方式是
from Package.SubPackage.Module import *
==================================
Python模塊包中__init__.py文件的作用
http://hi.baidu.com/nkhzj/blog/item/a6f0df00b2c39716728b65f1.html
模塊包:
包通常總是一個目錄,目錄下爲首的一個文件便是 __init__.py。然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。差不多就像這樣吧:
Package1/ __init__.py
Module1.py
Module2.py
Package2/ __init__.py
Module1.py
Module2.py
我們可以就這樣導入一個包:
import
Package1
或者調入一個子模塊和子包:
from Package1 import Module1
from Package1 import Package2
import Packag1.Module1
import Packag1.Package2
可以深入好幾層包結構:
from Package1.Package2 import Module1
import Package1.Package2.Module1
大致就這樣吧,我覺得,包的精髓應該是在 __init__.py 這個文件之中的。
__init__.py 文件:
__init__.py 控制着包的導入行爲。假如 __init__.py 爲空,那麼僅僅導入包是什麼都做不了的。
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last):
File "<pyshell#1>", line 1, in ?
Package1.Module1
AttributeError: 'module' object has no attribute 'Module1'
我們需要在 __init__.py 裏把 Module1 預先導入:
#文件 __init__.py
import
Module1
測試:
>>> import Package1
>>> Package1.Module1
<module 'Package1.Module1' from
'Module.pyc'>
__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:
from PackageName import *
這時 import 就會把註冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:
#文件 __init__.py
__all__ = ['Module1' , 'Module2' , 'Package2' ]
測試:
>>> from Package1 import *
>>> Module2
<module 'Package1.Module2' from 'Module.pyc'>
__init__.py 文件會在導入時被執行。