__init__.py是個什麼鬼?
#aaa/__init__.py
print(__name__
)num = 10
#執行a.py的結果:a.py
import
aaaprint(aaa.num)
aaa包的本質就是資料夾,匯入包就相當於匯入包下的__init__.py檔案10
看個複雜的包的使用(這種匯入包的方式不推薦)
#執行這個a.py檔案,會建立乙個glance資料夾,裡面有三個資料夾api、cmd 和db,有幾個py檔案。a.py
import
osos.makedirs(
'glance/api
') #
建立目錄
os.makedirs('
glance/cmd')
os.makedirs(
'glance/db')
init_lst = ['
glance/__init__.py
', '
glance/api/__init__.py
', '
glance/cmd/__init__.py
', '
glance/db/__init__.py']
for initfile in init_lst: #
建立檔案並寫入內容
with open(initfile, "
w", encoding="
utf-8
") as f:
f.write(f
"""#
""")
file_lst = ['
glance/api/versions.py
', '
glance/cmd/manage.py
', '
glance/db/models.py
', '
glance/api/policy.py']
for filepath in
file_lst:
with open(filepath, "w
", encoding="
utf-8
") as f: #
建立檔案並寫入內容
f.write(f"""
# def func():
print("我在中")
""")
import 包(不推薦使用,很容易出現模組找不到的情況哦!)
#執行b.py的結果:b.py
import
glance
glance.api.policy.func()
traceback (most recent call last):原因分析:file
"g:/python28/code/day06/整理筆記/python模組的使用/b.py
", line 5, in
glance.api.policy.func()
attributeerror: module
'glance
' has no attribute '
api'
因為import glance實際上是匯入的glance/__init__.py,因為glance/__init__.py是個空檔案,並沒有api包的匯入,所以報錯。
解決這個報錯
#執行結果:glance/__init__.py
import glance.api
traceback (most recent call last):依然報錯,接著按照上面的處理方法處理:file
"g:/python28/code/day06/整理筆記/python模組的使用/b.py
", line 5, in
glance.api.policy.func()
attributeerror: module
'glance.api
' has no attribute '
policy
'
#執行glance/api/__init__.py的結果:glance/api/__init__.py
import glance.api.policy
我在glance/api/policy.py中正常了,但是這個解決辦法太麻煩了,需要在每個包的__init__.py檔案中做包和模組的匯入。正確匯入包的方法看下面的**。
from 包 import 模組(推薦使用)from 包.包 import 模組(推薦使用)
#執行b.py的結果:b.py
from glance.api import
policy
policy.func()
我在glance/api/policy.py中首先確認下,剛剛執行的py檔案,是和glance同級的b.py檔案。如果在glance/api/policy.py檔案中呼叫glance/cmd/manage.py中的方法,怎麼操作吶?我把glance目錄裡所有的__init__.py檔案的內容都清空。
#執行glance/api/policy.py的結果:glance/api/policy.py
from ..cmd import
manage
deffunc():
print("
我在glance/api/policy.py中")
manage.func()
traceback (most recent call last):報錯了,這個報錯一定要記住,意思是不能超過當前py檔案所在包的範圍。那應該怎麼解決吶?file
"g:/python28/code/day06/整理筆記/python模組的使用/glance/api/policy.py
", line 2, in
from ..cmd import
manage
valueerror: attempted relative
import beyond top-level package
#執行glance/api/policy.py結果:glance/api/policy.py
from glance.cmd import
manage
deffunc():
print("
我在glance/api/policy.py中")
manage.func()
我在glance/cmd/manage.py中為什麼這種方式匯入包和模組就不報錯了吶?看下面的程式,你就知道答案了。
#執行glance/api/policy.py結果:glance/api/policy.py
import
sysfrom glance.cmd import
manage
deffunc():
print("
我在glance/api/policy.py中")
manage.func()
for path in
sys.path:
print(path)
g:\python28\code\day06\整理筆記\python模組的使用\glance\api上面列印的是環境變數,重點是看第3條結果,因為在第3條的基礎上是可以直接匯入glance包的,第一條是當前py檔案所在的目錄。g:\python28\code
g:\python28\code\day06\整理筆記\python模組的使用
d:\program files\jetbrains\pycharm 2019.1\helpers\pycharm_display
g:\python3.6\python36.zip
g:\python3.6\dlls
g:\python3.6\lib
g:\python3.6g:\python3.6\lib\site-packages
g:\python3.6\lib\site-packages\win32
g:\python3.6\lib\site-packages\win32\lib
g:\python3.6\lib\site-packages\pythonwin
d:\program files\jetbrains\pycharm 2019.1\helpers\pycharm_matplotlib_backend
總結:在包內啟動的時候,盡量不要使用相對路徑。
盡量在包外啟動。
Python3中的模組和包使用
包就好像我們的資料夾一樣,模組和包就像資料夾和檔案的關係,模組可以放在包裡。也可以不往裡面放 為什麼要劃分不同的模組?在同乙個模組中 量太大,的可讀性 避免變數名和函式名重複 模組應該怎麼去劃分?一般情況下 量不超過1000行 方法一 import test2 使用的時候 test2.login 方...
python3匯入類 Python筆記 匯入類
鎮貼圖自攝。被壓縮的好厲害呀 在家好無聊啊好無聊啊.匯入單個類 由於模擬較繁瑣,所以我們可以設定文件字串,形如 乙個可用於表示汽車的類 class car 一次模擬汽車的簡單嘗試 def init self,make,model,year self.make make self.model mode...
Python3中自定義包和匯入自定義包
第一篇部落格,寫得質量可能會不高,但希望能開個好頭,努力成為優秀的程式設計師!今天在惡補python基礎知識,發現我對包,庫,模組的定義非常模糊,於是我回頭看了一下基礎知識,也是一時興起想讓跟我一樣一開始有些困惑的人避坑!要想知道什麼是包,得先了解一下模組的概念!知道了模組,那緊接著看看包 上面是我...