關於python中的包,模塊導入的問題詳解(二)

  • from import導入

    緊接着的是from xx import xx  語法

    

 1 ################
 2 from my_moudule import name
 3 print(name)
 4 
 5 name='123'
 6 print(name)
 7 
 8 from my_module import name 
 9 print(name)
10 
11 
12 
13 from my_module import name,read1,read2  #導入模塊中多個變量
14 
15 
16 from my_mosule import nam as n,read1 as r1,read2 as r2  #重命名
17 
18 ####---------星號的用法----------#####
19 from my_module import *   #導入模塊中所有的名字
20 
21 
22 #在被導入模塊中不希望被全部導入 可以定義一個參數名為__all__的參數列表
23 
24 __all__=['name','read1','read2']
25 
26 
27 #這樣,即使當前模塊導入了該模塊所有的名字,也只能調用__all__列表中的名字
 

 

28 ########3---------------------------------------######
29 
30 
31 
32 
33 
34 
35 ################################
36 這種方式導入 的包調用時可以假象成在當前模塊定義的變量,調用方便 

 


  • 二:pyc文件
pyc:當文件被當作模塊調用時會自動產生pyc文件,python文件被編譯后就得到pyc(二進制)文件,再次被調用時,就不用再次編譯,直接引用,  

1 pyc文件的優點:
2         1,python為了提高運行效率也會進行編譯,python是解釋型語言,運行的時候需要通過python解釋器編譯,所以先編譯出pyc文件后,可以節省編譯這一步的耗時時間。
3 
4         2,不想讓源碼泄露,因為py文件是可以直接看到源碼的,對於一般的商業公司來說,這有點不妙,因為pyc文件可以獨立於py文件,刪除py文件也不會出錯。這就是太好了,只需要編譯成pyc文件再發布出去就好了。

 

  •  三:模塊的導入和修改
############
import file_1
print(file_1.name)
##修改源文件name
import file_1
print(file_1.name)  #####結果不會受影響,依舊是最開始的值,,



原因:import不會多次導入一個模塊,即便有改動,也檢測不到
非要強制修改可使用importlib模塊中的reload方法

from importlib import reload


******
*****
**
reload(file_1)

*****
****
**
#結果就會更改了 不 要 經 常 用!!!!
  • 四:模塊的循環使用 

 現有  A   B  兩個文件,A引用了B ,B同時也引用了A,這就是循環引用,要避免這種設計

 

《關於python中的包,模塊導入的問題詳解(二)》

五:dir(模塊)

dir(模塊)  :可以獲取到這個模塊中所有的名字,可以使用反射的方法對元素進行操作,因為是以字符串形式返回的

 

 

 二:包的導入:

2.1、什麼是包:

    含有一個__init__.py的文件夾就是一個包,包中通常含有一些py文件,一般包是給我們提供複雜功能的功能

   在python2中需要注意的是,如果建的文件選擇的不是文件包,不會產生__init__.py文件,會出現導入不成功的錯誤!!!

手動建立這個文件就可以。導入包的過程中自動執行了__init__.py文件

 

2.2、從包當中導入模塊

 1 #############從包中導入模塊的兩種方法
 2 
 3 同包當中導入模塊
 4 
 5 ##########111111
 6 import
 7 
 8 #import  包.包.包.包.包.包.包.模塊
 9 #最終是要精確到模塊才行
10 
11 
12 
13 
14 
15 
16 
17 
18 from   import#####個人推薦
19 
20 from 包.包.包.包 import 模塊    #把包和模塊分離   且調用更方便
21 app.get()  #模塊名.方法
22 from 包.包.包.包.包.模塊  import 方法   #具體到模塊以下,,直接調用方法
23 get()#直接方法名即可

 

2.3、導入包:

《關於python中的包,模塊導入的問題詳解(二)》

 

如圖所示的導入,雖然能成功導入,卻無法使用這個包中的模塊或者工具集
原因是路徑問題,
包導入的絕對(路徑)導入:是我們在導入包需注意的一點,要以根節點為起點導入
    缺點:每次移動模塊都需要重新修改路徑
    優點:模塊可以單獨執行
 1 ######目錄結構###
 2  2 
 3  3 ---/
 4  4     |
 5  5     |
 6  6     glance2——
 7  7     |               |
 8  8     |               |——__init__.py   ----->(from glance2 import api )    
 9  9     |               |
10 10    |                api——    
11 11    |                          |
12 12    |                          |——__init__.py--------->(from glance2.api  import policy)   
13 13    |                          |
14 14    |                          |——policy.py  ------->(def get(): print("123"))
15 15 
16 16 ######################glance3同級目錄可調用
17 
18 import  glance2     #執行了glance2下的__init__.py文件
19 glance2.api      #找不到方法
20 
21 #報錯  ,如上圖所示
22 sys.path中的內容,永遠是當前執行文件的路徑
23 
24 按上圖路徑配置即可
25 
26 每個路徑都明明白白寫清楚,清晰看到目錄結構,方便後續開發


包導入的相對(路徑)導入:(.)表示當前目錄,,(..)上級目錄
    優點:
文件夾有移動也不會影響整個程序,只要能找到最相對根目錄就可以導入
    缺點:只要帶相對路徑導入的模塊,就無法單獨執行,只能當作模塊給別人提供服務
 
 1 ######目錄結構###即使後面的開發工作中文件夾,,,文件夾有移動也不會影響整個程序
 2 
 3 ---/
 4     |
 5     |
 6     glance3——
 7                    |
 8                    |——__init__.py   ----->(from . import api)    #相對導入
 9                    |
10                    api——    
11                             |
12                             |——__init__.py--------->(from . iport policy)   #相對導入
13                             |
14                             |——policy.py  ------->(def get(): print("123"))
15 
16 ######################glance3同級目錄可調用
17 import glance3
18 glance3.api.policy.get()
19             
20 
21 
22 123

 








 

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *