1、import 模塊python
import一個模塊至關於執行了這個模塊,導入模塊後可使用模塊中的屬性和方法,好比模塊名.變量、模塊名.函數api
當前模塊和被導入模塊是存在兩個不一樣的內存空間ide
import模塊的原理:函數
① 尋找模塊spa
② 找到模塊就開闢一塊空間,來執行這個模塊code
③ 把這個模塊中用到的名字都收錄到新開闢的空間中blog
④ 建立一個變量來引用這個模塊的空間內存
導入模塊注意點:pycharm
① 一個模塊不能被重複導入
② 模塊和模塊之間的內存空間始終是隔離的cmd
③ 模塊的名字必須符合變量的命名規則,不然沒法導入
④ 被導入模塊的方法只會找到它本身的模塊空間的屬性
⑤ 一行只能導入一個模塊(符合PEP8規範)
能夠給導入的模塊起別名,但起了別名之後,原來的模塊名就不能使用了。
起別名的原理:找到這個模塊,用別名指向它,因此原模塊名跟模塊不要緊了
import XXX as X
# mymodule.py
a = 1
def func(): print(222) # main.py
import mymodule as m print(m.a) m.func()
模塊的搜索路徑:
執行一個文件,依靠的是sys.path
pycharm會將項目的目錄放進去,可是運行程序有時並不在pycham,
目前python會及那個當前文件的目錄導進來,而後再導入項目
正常的sys.path中除了內置、擴展模塊所在的路徑以外
只有一個路徑是永遠不會出現問題,直接執行的這個文件所在的目錄
一個模塊可否被導入,就看這個模塊所在的目錄在不在sys.path中
兩種運行py文件的方式:
① 直接運行:cmd下 python xxx.py
以腳本的形式去運行,__name__ == '__main__'
② 導入模塊
__name__ == '模塊名'
if __name__ == '__main__'
當一個文件做爲一個腳本又做爲一個模塊,做爲模塊的時候將打印的東西放在 if __name__ == '__main__' 邏輯裏
全部的打印邏輯和函數的調用,都放在 if __name__ == '__main__' 的邏輯內,一旦導入模塊的時候,if的內容不會執行
2、from... import ...
① from 模塊 import 變量/方法
找到模塊,開闢空間執行模塊
全部的模塊裏的屬性和方法都存儲的模塊的所屬的空間中
在全局命名空間建立一個變量名/方法名分別指向模塊中的名字
# mymodule.py
a = 1
def func(): print(222) # main.py
from mymodule import a print(a)
② from 模塊 import *
至關於把模塊的全部方法、變量導入到當前的全局命名空間中。
通常狀況下,使用的變量超過5個就使用星號
在模塊中添加了 __all__, 把模塊裏能用的變量或者方法放在__all__中,但all只能跟*配合使用
# mymodule.py
__all__ = ['a','b'] # 若是導入的是星號,只能使用a、b兩個變量,不能使用方法
a = 1 b = 2
def func(): print(222) def func2(): print(333) # main.py
from mymodule import * # 只能使用模塊裏__all__定義的內容
func() print(a) # 報錯,NameError: name 'func' is not defined
3、模塊的補充:
① pyc文件、pyi文件
pyi文件是跟py同樣文件,只是後綴名不同,裏面也是python的代碼
pyc是編譯好的字節碼文件,但一個模塊看成模塊執行的時候,會產生一個pyc文件,下次導入模塊的時候,會直接使用pyc文件,假如在下次調用前模塊修改過,那麼纔會再產生一個pyc文件
pyc文件提升程序的啓動效率並不能提升程序的執行效率,pyc文件再啓動的時候會產生,若是要提升啓動效率,提早先執行python程序
② 模塊的導入和修改
導入模塊後,在執行程序中修改模塊的內容,源程序不會使用修改後的值,就算從新導入模塊也不會使用修改後的值
解決方法(不建議使用):
from importlib import reload
reload(模塊名)
③ 模塊的循環引用
A import B
B import A
循環引用會報錯,在程序中不要發生循環引用的問題,只能是單向引用,不能成環。
④ dir(模塊名)
dir(模塊名) 獲取模塊的是全部方法和屬性,用反射的方式來調用
4、包
python3中的Directory和package都帶__init__.py的文件
含有一個__init__.py的文件夾就是一個包
python2中沒有__init__.py文件就不能導入模塊了,可是能夠手動建立__init__.py,這樣就變成了一個包
從包中導入模塊:
imprt XXX.XXX.XXX
點的左邊必須是一個包,終點必須是一個模塊,精確到具體的模塊
from ... import ...
通常狀況:from 包 import 模塊
導入包:
導入包的過程至關於執行了這個包的__init__.py文件
做爲一個包,全部包內的文件的導入都要考慮sys.path的問題(相對導入了這個問題)
sys.path中的內容 永遠是當前執行的文件
絕對路徑導入優勢:能看清楚目錄的層次關係
絕對路徑導入缺點:每次移動都要修改絕對導入路徑
glance/ ├── __init__.py from glance import api from glance import cmd from glance import db ├── api │ ├── __init__.py from glance.api import policy from glance.api import versions │ ├── policy.py │ └── versions.py ├── cmd from glance.cmd import manage │ ├── __init__.py │ └── manage.py └── db from glance.db import models ├── __init__.py └── models.py
相對路徑導入
. 表示當前目錄
.. 表示上一層目錄
glance/ ├── __init__.py from . import api #.表示當前目錄
from . import cmd from . import db ├── api │ ├── __init__.py from . import policy from . import versions │ ├── policy.py │ └── versions.py ├── cmd from . import manage │ ├── __init__.py │ └── manage.py from ..api import policy #..表示上一級目錄,想再manage中使用policy中的方法就須要回到上一級glance目錄往下找api包,從api導入policy
└── db from . import models ├── __init__.py └── models.py 相對導入
若是帶着相對路徑導入的文件,就不能被執行,只能是看成模塊導入。
相對路徑導入通常是給包外的文件提供服務,包內的文件不能執行,運用了相對路徑導入的文件不能被執行。
5、項目目錄規劃
項目名稱的文件夾
bin 文件夾 (只能由start.py 文件,只有一個文件,並且名字不能改變)
start.py # 負責項目的啓動
conf 文件夾 (配置文件的目錄,文件都要統一格式)
config.ini
settings.py(推薦使用)
core 文件夾 (存放的是核心代碼)
db 文件夾 (存放的是數據文件,不是py文件)
lib 文件夾 (存放庫文件,放第三方模塊或者自定義模塊)
log 文件夾 (存放的是log文件)
log