# impot導入模塊在使用時必須加前綴"模塊."
# 優點:肯定不會與當前名稱空間中的名字沖突
# 缺點:加前綴顯得麻煩
# from ... import ...導入也發生了三件事
# 1、產一個模塊的名稱空間
# 2、運行foo.py將運行過程中產生的名字都丟到模塊的名稱空間去
# 3、在當前名稱空間拿到一個名字,該名字與模塊名稱空間中的某一個內存地址
# from foo import x # x=模塊foo中值0的內存地址
# from foo import get
# from foo import change
# print(x)
# print(get)
# print(change)
# x=333333333
# print(x)
# get()
# change()
# get()
# print(x)
# from foo import x # x=新地址
# print(x)
# from...impot...導入模塊在使用時不用加前綴
# 優點:代碼更精簡
# 缺點:容易與當前名稱空間混淆
# from foo import x # x=模塊foo中值1的內存地址
# x=1111
# 一行導入多個名字(不推薦)
# from foo import x,get,change
# *:導入模塊中的所有名字
# name='egon'
# from foo import *
# print(name)
from socket import *
# 了解:__all__
# from foo import *
# print(x)
# print(get)
# print(change)
# 起別名
from foo import get as g
print(g)
模塊的搜索路徑優先級
# 無論是import還是from...import在導入模塊時都涉及到查找問題
# 優先級:
# 1、內存(內置模塊)
# 2、硬盤:按照sys.path中存放的文件的順序依次查找要導入的模塊
# import sys
# 值為一個列表,存放了一系列的對文件夾
# 其中第一個文件夾是當前執行文件所在的文件夾
# print(sys.path)
# import foo # 內存中已經有foo了
# foo.say()
#
# import time
# time.sleep(10)
#
# import foo
# foo.say()
# 了解:sys.modules查看已經加載到內存中的模塊
import sys
# import foo # foo=模塊的內存地址
# del foo
# def func():
# import foo # foo=模塊的內存地址
#
# func()
#
# # print('foo' in sys.modules)
# print(sys.modules)
import sys
# 找foo.py就把foo.py的文件夾添加到環境變量中
sys.path.append(r'/Users/linhaifeng/PycharmProjects/s14/day21/aa')
# import foo
# foo.say()
from foo import say
執行py文件與導入py文件的區別是什么?
# print(__name__) #
# 1、當foo.py被運行時,__name__的值為'__main__'
# 1、當foo.py被當做模塊導入時,__name__的值為'foo'
# if __name__ == '__main__':
# print('文件被執行')
# get()
# change()
# else:
# # 被當做模塊導入時做的事情
# print('文件被導入')
# pass
絕對導入和相對導入
# 絕對導入,以包的文件夾作為起始來進行導入
# # import sys
# # print('==========>這是在被導入的__init__.py中查看到的sys.path')
# # print(sys.path)
#
#
# from foo.m1 import f1
# from foo.m2 import f2
# from foo.m3 import f3
#
# from foo.bbb.m4 import f4 # foo內有了一個f4
# # import foo.bbb.m4.f4 # 語法錯誤,點的左側必須是一個包
# 相對導入:僅限於包內使用,不能跨出包(包內模塊之間的導入,推薦使用相對導入) (頂層包中的文件,想調用子包中的模塊,必須用絕對路徑。)
# .:代表當前文件夾
# ..:代表上一層文件夾
from .m1 import f1
from .m2 import f2
from .m3 import f3
from .bbb.m4 import f4
# 強調:
# 1、相對導入不能跨出包,所以相對導入僅限於包內模板彼此之間鬧着玩
# 而絕對導入是沒有任何限制的,所以絕對導入是一種通用的導入方式
包的導入
# 強調:
# 1.關於包相關的導入語句也分為import和from ... import ...
# 兩種,但是無論哪種,無論在什么位置,在導入時都必須遵循一個原則:
# 凡是在導入時帶點的,點的左邊都必須是一個包,否則非法。
# 可以帶有一連串的點,如import 頂級包.子包.子模塊,但都必須遵循這個原則。但對於導入后,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。
# 例如:
# from a.b.c.d.e.f import xxx
# import a.b.c.d.e.f
# 其中a、b、c、d、e 都必須是包
# 2、包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間
#
# 3、import導入文件時,產生名稱空間中的名字來源於文件,
# import 包,產生的名稱空間的名字同樣來源於文件,即包下的__init__.py,導入包本質就是在導入該文件
# import foo
# # print(foo.f1)
# # print(foo.f2)
# # print(foo.f3)
# # print(foo.f4)
#
# foo.f4()
# from foo import *
# print(f1)
# print(f2)
# print(f3)
# print(f4)
添加到環境變量
import sys
import os
# sys.path.append(r'C:\DFSInfo.txt')
# print(sys.path)
# BASE_DIR = os.path.dirname(__file__)
# print(BASE_DIR)
# sys.path.append(BASE_DIR)
# from pathlib import Path
#
# root = Path(__file__)
# print(root)
# res = root.parent.parent
# print(res)
強調 : 不要相互導入
純做記錄
這篇寫得不錯:https://blog.csdn.net/weixin_38256474/article/details/81228492