最近身邊一些朋友發生在項目當中編寫自己模塊,導入的時候無法導入的問題。
下面我來分享一下關於python中導入模塊的一些基本知識。
1 導入模塊時尋找路徑
在每一個運行的python程序當中,都維護了一套sys文件,在這里面的path變量里,存儲了在當前程序中導入模塊時候尋找的路徑。
上代碼看一下:
1 import sys 2 3 if __name__ == '__main__': 4 file_path = sys.path 5 for i in file_path: 6 print(i) 7 ''' 8 執行結果: 9 10 D:\Workspaces\PycharmProjects 11 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\python35.zip 12 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\DLLs 13 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib 14 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35 15 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib\site-packages 16 '''
請讓我來 解釋一下~
我們導入sys,查看了sys.path。path是一個列表,里邊存儲了多個路徑,這些路徑是如果我們進行import 模塊操作的時候,python會從這個路徑從第一個開始到最后一個一個一個路徑去找我們的模塊,直到找了或者都沒找到,再拋出異常。
如果我們自己寫的模塊放在奇怪的地方,在程序中import自然是無法為導入的。這個時候怎么辦呢??
我們可以向sys.path這個列表的第一個位置里插入一個路徑,就是我們自己編寫的模塊存放的位置。這樣python再找的時候就能找到了。
上代碼:
1 import sys 2 3 if __name__ == '__main__': 4 sys.path.insert(0, ".\\" ) 5 6 file_path = sys.path 7 for i in file_path: 8 print(i) 9 ''' 10 執行結果: 11 12 .\ 13 D:\Workspaces\PycharmProjects 14 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\python35.zip 15 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\DLLs 16 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib 17 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35 18 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib\site-packages 19 '''
這一次呢,我們在程序執行之前對sys.path進行了insert( 0 , str) ,這是列表的基本操作,在0號位置插入了str。這個str則是 模塊所在的路徑
我向里面插入了.\\代表當前路徑,在打印結果中.\就占了第一個位置。
有些小伙伴有疑問 我添加的是.\\ 為什么出來的結果是.\
這個問題呢是字符串的轉義問題。在編程語言和操作系統中,識別 \ 是有特殊含義的,比如 \n 代表換行 \r 代表回車 \0 代表字符串結束等等。
當解析器遇到\ 他會默認和后面一個字符組合成一個字符。我們輸入 \\ 其實是告訴計算機 我們想要輸入的是 \ , 這是轉義字符的基本概念哦~
2 模塊的重導入
有的時候,我們程序在運行着,然后我們改變了程序內用到的模塊的一些內容,但是程序運行結果沒有按照我們修改的模塊內容改變。
這個時候 即使我們再import 模塊 運行結果還是沒有改變。
這個時候要普及一下python解釋器導入模塊的一些基礎知識:
當第一次import 模塊 的時候,這個模塊就常駐內存了,代碼等都已經復制過來。每次調用模塊方法的時候不會再去找模塊內的代碼,而是在內存中直接使用。所以當我們修改模塊內代碼,程序運行結果沒有變,因為程序只導入了一次模塊,並且記住里面所有東西。之后調用模塊方法全憑內存內的記憶!
即使我們再import 模塊,python認為 我的內存當中有這個模塊我們已經導入過了,就會忽略這個語句,不會導入了。
那怎么辦呢????
這時候我們需要使用模重導入:
1 import imp 2 imp.reload(a) #把我們要重新導入的模塊a進行重新導入 3 a.a()
這樣就ok啦! 更新了內存當中之前導入的模塊啦!