模塊導入 當文件夾中有這樣一個自定義的command模塊 在它的內部寫下下列代碼: 然後我們在command模塊中執行下列代碼: 我們如果在這段程式中反覆執行多次這一段代碼,這一個文件結果也只會被導入一次 調用command模塊中的方法fuc() 當我們寫這樣一個代碼的時候,電腦會先去找到這一個模 ...
模塊導入
當文件夾中有這樣一個自定義的command模塊
在它的內部寫下下列代碼:
print('這個py文件被調用!') def fuc(): print('這個函數被調用!')
然後我們在command模塊中執行下列代碼:
import command #這個py文件被調用!
我們如果在這段程式中反覆執行多次這一段代碼,這一個文件結果也只會被導入一次
import command #這個py文件被調用! import command import command import command import command import command
調用command模塊中的方法fuc()
import command #這個py文件被調用! command.fuc() #這個函數被調用!
當我們寫這樣一個代碼的時候,電腦會先去找到這一個模塊,找到之後再創建這個模塊的命名空間,把文件夾的名字都放在命名空間里
如果我們在temp_py.py中也寫一個fuc()函數:
import command #這個py文件被調用! def fuc(): print('hello __fuc__') command.fuc() #這個函數被調用!
那麼實際上它調用的還是command模塊內的函數
如果在command模塊內和temp_py.py中加入相同的變數:
command模塊代碼:
print('這個py文件被調用!') number = 150 def fuc(): print('這個函數被調用!',number) #number獲取到一個記憶體地址再從中拿到值
temp_py.py執行代碼:
import command #這個py文件被調用! number = 300 print(command.number) #150 print(number) #300
當你要導入一個模塊的時候,電腦會先到sys.modules()中去找你導入的這個模塊是否在這個裡面
import command #這個py文件被調用! import sys print(sys.modules.keys()) #dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'encodings.cp437', 'command'])
在最後我們可以看到之前的command模塊有被成功導入
如果我們要找的這個模塊在sys.modules()中找不到,那麼就依據sys.path()路徑去找到模塊,若找到就創建這個模塊的命名空間再把文件名陳放在記憶體里並執行,若找不到那麼就會報錯
給模塊取別名:
語法:import '模塊名' as '別名'
import command as comd #這個py文件被調用! comd.fuc() #這個函數被調用! 150 import time as t print(t.time()) #1567359703.0011516 print(time.time()) #NameError: name 'time' is not defined
假設有兩個模塊xmlreader.py和csvreader.py,它們都定義了函數read_data(filename):用來從文件中讀取一些數據,但採用不同的輸入格式.可以編寫代碼來選擇性地挑選讀取模塊,例如
if file_format == 'xml': import xmlreader as reader elif file_format == 'csv': import csvreader as reader data=reader.read_date(filename)
一行獲取模塊:
import sys,os,pickle,shelve,json
不推薦這樣寫後期不好維護,建議一行一行寫在開頭,能夠讓人一目瞭然
模塊的寫法順序:
內置模塊(re、time等)、擴展的模塊(django等)、自定義的模塊
from...import...的用法
from time import time print(time()) #1567360779.0056956 from sys import version print(version) #3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]
在pycharm中,如果是自定義模塊要用from...import...調用方法有紅色的波浪線報錯是因為pycharm主觀認為從根目錄去找這個模塊,結果卻找不到,但其實這個模塊可以從sys.path()中找到
若在temp_py.py定義一個和fuc同名的函數,讓我們來看看執行結果:
from command import fuc #這個py文件被調用! def fuc(): print('!!!!!!!') #!!!!!!! fuc()
也支持獲取多個方法:
from 模塊名 import *
它能把模塊內的名字都調用
缺點:不安全怕重名
from time import * sleep = 10 sleep(0.1) #TypeError: 'int' object is not callable
__all__
只和from 模塊名 import *有關
如果有被__all__約束住那麼才能夠執行
__name__
當我們直接執行這個模塊的時候,這裡的__name__就等於'__main__'
__all__ = ['number','fuc'] print('這個py文件被調用!') number = 150 #這裡的值已經放到了記憶體地址中 def fuc(): print('這個函數被調用!',number) def fuc2(): print('fuc2') def fuc3(): print('fuc3') print(__name__) #__main__
當我們執行其他模塊的時候,在其他模塊中引用這個模塊,這個模塊中的__name__就等於'這個模塊的名字'
import command #這個py文件被調用! #command
有些時候當我們在其他模塊中調用模塊時,調用的這個模塊本身可能有一些測試的代碼,如果我們直接調用的話那麼這些測試的代碼也會跟著一起執行出來,但是實際上我們在調用這個模塊的時候並不想讓它裡面的內容直接就跑出來,所以我們就要在這個模塊中添加一個判斷來確定它的__name__
當在這個模塊執行時:
__all__ = ['number','fuc'] print('這個py文件被調用!') number = 150 #這裡的值已經放到了記憶體地址中 def fuc(): print('這個函數被調用!',number) def fuc2(): print('fuc2') def fuc3(): print('fuc3') if __name__ == '__main__': print('執行下列調試代碼或其他功能代碼...') #執行下列調試代碼或其他功能代碼...
在其他模塊調用這個模塊時,模塊中的那些調試代碼就不會再被直接執行了
import command #這個py文件被調用!