pythoninitpy包
A. python中setup.py和_init_.py的作用
_init_.py,是要想讓一個文件夾成為包的必須的文件!這個文件可以為空,但是必須得有!
setup.py,是用來安裝模塊用的,dos命令下!
B. Python中的init.py有什麼作用
你指的應該是是__init__.py文件,以下下詳細解釋:
__init__.py該文件的作用就是相當於把自身整個文件夾當作一個包來管理,每當有外部import的時候,就會自動執行裡面的函數。
它具有以下幾個作用:
1. 標識該目錄是一個python的模塊包(mole package)
如果你是使用python的相關IDE來進行開發,那麼如果目錄中存在該文件,該目錄就會被識別為 mole package 。
2. 簡化模塊導入操作
假設我們的模塊包的目錄結構如下:
.
└── mypackage
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py
如果我們使用最直接的導入方式,將整個文件拷貝到工程目錄下,然後直接導入:
from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32
這樣的話,看起來就會很麻煩,查找的時候也會麻煩,此時__init__.py就起到了簡化的作用。
2.1init.py 是怎麼工作的?
實際上,如果目錄中包含了__init__.py時,當用 import 導入該目錄時,會執行__init__.py裡面的代碼。我們在mypackage目錄下增加一個__ init __.py文件來做一個實驗:
.
└── mypackage
├── __init__.py
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py
mypackage/__init__.py裡面加一個print,如果執行了該文件就會輸出
print("You have imported mypackage")
下面直接用交互模式進行 import
>>> import mypackage
You have imported mypackage
很顯然,__init__.py在包被導入時會被執行。
2.2 控制模塊導入
我們再做一個實驗,在 mypackage/init.py 添加以下語句:
from subpackage_1 import test11
我們導入 mypackage 試試:
>>> import mypackageTraceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "/home/taopeng/Workspace/Test/mypackage/__init__.py", line 2, in <mole>
from subpackage_1 import test11ImportError: No mole named 'subpackage_1'
報錯了。。。怎麼回事?
原來,在我們執行import時,當前目錄是不會變的(就算是執行子目錄的文件),還是需要完整的包名。
from mypackage.subpackage_1 import test11
綜上,我們可以在init.py 指定默認需要導入的模塊
2.3 偷懶的導入方法
有時候我們在做導入時會偷懶,將包中的所有內容導入
from mypackage import *
這是怎麼實現的呢?__all__變數就是干這個工作的。
__all__關聯了一個模塊列表,當執行from xx import *時,就會導入列表中的模塊。我們將__init__.py修改為 :
__all__ = ['subpackage_1', 'subpackage_2']
這里沒有包含subpackage_3,是為了證明__all__起作用了,而不是導入了所有子目錄。
>>> from mypackage import *
>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>>
>>> dir(subpackage_1)['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
子目錄的中的模塊沒有導入!!!
該例子中的導入等價於:from mypackage import subpackage_1, subpackage_2
因此,導入操作會繼續查找 subpackage_1 和 subpackage_2 中的__init__.py並執行。(但是此時不會執行 import *)
我們在 subpackage_1 下添加__init__.py文件:
__all__ = ['test11', 'test12']# 默認只導入test11
from mypackage.subpackage_1 import test11
再來導入試試
>>> from mypackage import *
>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>>
>>> dir(subpackage_1)['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'test11']
如果想要導入子包的所有模塊,則需要更精確指定。
>>> from mypackage.subpackage_1 import *
>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'test11', 'test12']
3. 配置模塊的初始化操作
在了解了__init__.py的工作原理後,應該能理解該文件就是一個正常的python代碼文件。
因此可以將初始化代碼放入該文件中。
C. python腳本下面的 __init__.py 有什麼作用
The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid moles that occur later on the mole search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__variable, described later.
在文件夾中包含一個__init__.py,Python就會把文件夾當作一個package,裡面的py文件就能夠在外面被import了。
例如文件夾結構是:
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
外部就可以import sound.effects.echo來使用,sound文件夾和effects文件夾都被處理成package了。
D. python中包的理解與運用
6.4. 包
包通常是使用用「圓點模塊名」的結構化模塊命名空間。例如,名為 A.B 的模塊表示了名為 A 的包中名為 B 的子模塊。正如同用模塊來保存不同的模塊架構可以避免全局變數之間的相互沖突,使用圓點模塊名保存像 NumPy 或 Python Imaging Library 之類的不同類庫架構可以避免模塊之間的命名沖突。
假設你現在想要設計一個模塊集(一個「包」)來統一處理聲音文件和聲音數據。存在幾種不同的聲音格式(通常由它們的擴展名來標識,例如:.wav, .aiff,.au ),於是,為了在不同類型的文件格式之間轉換,你需要維護一個不斷增長的包集合。可能你還想要對聲音數據做很多不同的操作(例如混音,添加回聲,應用平衡 功能,創建一個人造效果),所以你要加入一個無限流模塊來執行這些操作。你的包可能會是這個樣子(通過分級的文件體系來進行分組)
當導入這個包時,Python 通過 sys.path 搜索路徑查找包含這個包的子目錄。
為了讓 Python 將目錄當作內容包,目錄中必須包含 __init__.py 文件。這是為了避免一個含有爛俗名字的目錄無意中隱藏了稍後在模塊搜索路徑中出現的有效模塊,比如 string。最簡單的情況下,只需要一個空的 __init__.py 文件即可。當然它也可以執行包的初始化代碼,或者定義稍後介紹的 __all__ 變數。
用戶可以每次只導入包里的特定模塊,例如:
import sound.effects.echo
這樣就導入了 sound.effects.echo 子模塊。它必需通過完整的名稱來引用:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
導入包時有一個可以選擇的方式:
from sound.effects import echo
這樣就載入了 echo 子模塊,並且使得它在沒有包前綴的情況下也可以使用,所以它可以如下方式調用:
echo.echofilter(input, output, delay=0.7, atten=4)
還有另一種變體用於直接導入函數或變數:
from sound.effects.echo import echofilter
這樣就又一次載入了 echo 子模塊,但這樣就可以直接調用它的 echofilter() 函數:
echofilter(input, output, delay=0.7, atten=4)
需要注意的是使用 from package import item 方式導入包時,這個子項(item)既可以是包中的一個子模塊(或一個子包),也可以是包中定義的其它命名,像函數、類或變數。import 語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模塊,並嘗試載入它。如果沒有找到它,會引發一個 ImportError 異常。
E. python程序包中為什麼會有__init__.py,這個有什麼作用
__init__.py的作用有如下幾點:
1. 相當於class中的def __init__(self):函數,用來初始化模塊。
2. 把所在目錄當作一個package處理
3. from-import 語句導入子包時需要用到它。 如果沒有用到, 他們可以是空文件。
如引入package.mole下的所有模塊
from package.mole import *
這樣的語句會導入哪些文件取決於操作系統的文件系統. 所以我們在__init__.py 中加入 __all__變數.
該變數包含執行這樣的語句時應該導入的模塊的名字. 它由一個模塊名字元串列表組成.
F. python腳本下面的 __init__.py 有什麼作用呢
_init_.py的作用:
首先一旦創建一個python的package,就會出來一個_init_.py的文件
init.py裡面一般寫這兩句話:
[1]:from .girl import hello
[2]:from .girl import *
[1]
一個是導入該package下的girl文件的hello函數
[2]
一個是導入該package下的girl文件的所有函數
比如在bb.py這個文件中導入girl的hello函數
原來init.py文件為空時:方法如下:
from boy.girl import hello
當寫成【1】時:
from boy import hello
兩者的關系時一致的。
至於第一個init.py有導入的作用,但我認為意義不大,
所以當前認為init.py最大的作用是區別該文件夾是package,還是純粹的目錄。