在python用import或者from…import來匯入相應的模組。模組其實就一些函數和類的集合檔案,它能實現一些相應的功能,當我們需要使用這些功能的時候,直接把相應的模組匯入到我們的程式中,我們就可以使用了。這類似於C語言中的include標頭檔案,Python中我們用import匯入我們需要的模組。
import sys
print('================Python import mode==========================');
print ('The command line arguments are:')
for i in sys.argv:
print (i)
print ('\n The python path',sys.path)
from sys import argv,path #匯入特定的成員
print('================python from import===================================')
print('path:',path)
#如果你要使用所有sys模組使用的名字,你可以這樣:
#from sys import *
#print('path:',path)
從以上我們可以簡單看出:
匯入mode,import與from…import的不同之處在於,簡單說:
如果你想要直接輸入argv變數到你的程式中而每次使用它時又不想打sys,
則可使用:from sys import argv
一般說來,應該避免使用from…import而使用import語句,
因爲這樣可以使你的程式更加易讀,也可以避免名稱的衝突
two.py
__all__ = ['a','b'] #__爲雙橫線
class two():
def __init__(self):
print('this is two')
a = 'this is two a'
b = 'this is two b'
if __name__=='__main__':
t = two()
one.py
from two import *
print a
print b
t = two()
這時,類two() 將不會被import * 匯入進來
類似於標頭檔案,模組也是需要系統的搜尋路徑的,下面 下麪的命令即是系統預設的搜尋路徑,當你匯入一個模組時,系統就會在下面 下麪的路徑列表中搜尋相應的檔案。
print(sys.path)
['/home/python/code', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages']
(從例表中,我們可以看到python會首先在當前工作目錄裡去找)
如果沒有找到相應的內容,則報錯:
import syss
Traceback (most recent call last):
File "D:/xxx/xxx/xx/Code/test.py", line 19, in <module>
import syss
ImportError: No module named syss
當然,我們也可以自行新增要搜尋路徑。呼叫列表的append方法即可:
import sys
sys.path.append('/home/python/newcode')
#!/user/bin/python
#Filename:mymodel.py
version = '1.0'
def sayHello():
print ('Hello world')
def modelName():
return __name__#返回它自己的名稱
#end of model
以上語句注意:
1.這個模組應該被放置在我們輸入它的程式的同一個目錄中,或者在sys.path所列目錄之一。
2.你已經看到,它與我們普通的Python程式相比並沒有什麼特別之處
然後:我們在test.py中來呼叫此模組:test.py
import sys,mymodel
sys.path.append('/home/python/newcode')#提供搜尋路徑
print(__name__) #此處列印主模組的名稱:__main__
mymodel.sayHello()
print('Version',mymodel.version)
print('Model Name',mymodel.modelName())#列印被匯入模組的名稱: mymodel
我們使用from…import…
print('======================from.....import=====================================')
from mymodel import *
print(__name__)#此處列印主模組的名稱:__main__
sayHello()
print('Version',version)
print('Model Name',modelName()) #列印被匯入模組的名稱: mymodel
以上語句注意:
1.我們可以通過import來匯入多個模組,用「,」(逗號)分隔。
2.注意import與from…import…
1.一個包的基本組織如下:
FC/
__init__.py
Libr/
__init__.py
one.py
two.py
....
Model/
__init__.py
one.py
....
在外部載入呼叫時,有以下方式:
coding:utf-8
載入方式一
import Fc.Libr.one
print Fc.Libr.one.a
載入方式二
from Fc.Libr import one
print one.a
載入方式三
from Fc.Libr.one import a
print a
載入方式四
from Fc.Libr import *
print one.a
注意直接使用第四種方式是不能正確匯入Libr下的one子模組的,這就需要在Fc目錄下的__init__.py檔案中定義好需要載入子模組的名稱
Fc/Libr/__init__.py
__all__=['one','two'] #定義載入子模組的名稱
在載入包模組時,在import語句執行期時,遇到的所有__init__.py檔案都會被執行,在上面程式碼中
首先會執行Fc目錄中的__int__.py,然後執行Libr目錄中的__init__.py
2.子模組加子模組問題
同一包的相同目錄中:
#coding:utf-8
#載入方式一:使用完全限定名稱
from Fc.Libr import one
aa = 'libr two load one---'+one.a
#載入方式二:使用相對匯入
from . import one
bb = 'libr two load one----'+one.b
方二中使用.來表示在同一級目錄中。
#載入方式三:(這種方式應當避免:最後找不到會轉移到標準庫)
import Fc.Libr.one
cc = 'libr two load one---'+Fc.Libr.one.a
在外部使用時:
#coding:utf-8
from Fc.Libr import *
print two.aa
print two.bb
同一包的不同目錄中:
#coding:utf-8
from ..Model import one
a = 'libr two load mode one---'+one.a
使用時:
#coding:utf-8
from Fc.Libr import *
print two.a
將輸出:libr two load mode one---fc model one
另外在匯入一個包時,會定義一個特殊的變數__path__,該變數包含一個目錄列表。
__path__可通過__init__.py檔案中包含的程式碼存取,最初包含的一項具有包的目錄名稱。我們可以
向__path__列表提供更多的目錄,以更改查詢子模組時使用的搜尋路徑,大型專案中這個很有用。
特別說明
1.import執行載入原始檔中所有語名(所以模組是一個檔案)。
2.import語句可以出現在程式中的任何位置。但是有一點是:無論import語句被使用了多少次,每個模組中的程式碼僅載入和執行一次,後續的import語句僅將模組名稱系結到前一次匯入所建立的模組物件上。
3.值有種使用sys.modules可檢視當前載入的所有模組。