python3 包的匯入和使用

2022-07-26 07:57:13 字數 4710 閱讀 2083

__init__.py是個什麼鬼?
#

aaa/__init__.py

print(__name__

)num = 10

#

a.py

import

aaaprint(aaa.num)

執行a.py的結果:

aaa

10

包的本質就是資料夾,匯入包就相當於匯入包下的__init__.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("我在中")

""")

執行這個a.py檔案,會建立乙個glance資料夾,裡面有三個資料夾api、cmd 和db,有幾個py檔案。

import 包(不推薦使用,很容易出現模組找不到的情況哦!)
#

b.py

import

glance

glance.api.policy.func()

執行b.py的結果:

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

import glance.api.policy

執行glance/api/__init__.py的結果:

我在glance/api/policy.py中
正常了,但是這個解決辦法太麻煩了,需要在每個包的__init__.py檔案中做包和模組的匯入。正確匯入包的方法看下面的**。

from 包 import 模組(推薦使用)

from 包.包 import 模組(推薦使用)

#

b.py

from glance.api import

policy

policy.func()

執行b.py的結果:

我在glance/api/policy.py中
首先確認下,剛剛執行的py檔案,是和glance同級的b.py檔案。如果在glance/api/policy.py檔案中呼叫glance/cmd/manage.py中的方法,怎麼操作吶?我把glance目錄裡所有的__init__.py檔案的內容都清空。

#

glance/api/policy.py

from ..cmd import

manage

deffunc():

print("

我在glance/api/policy.py中")

manage.func()

執行glance/api/policy.py的結果:

traceback (most recent call last):

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

報錯了,這個報錯一定要記住,意思是不能超過當前py檔案所在包的範圍。那應該怎麼解決吶?

#

glance/api/policy.py

from glance.cmd import

manage

deffunc():

print("

我在glance/api/policy.py中")

manage.func()

執行glance/api/policy.py結果:

我在glance/cmd/manage.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)

執行glance/api/policy.py結果:

g:\python28\code\day06\整理筆記\python模組的使用\glance\api

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

上面列印的是環境變數,重點是看第3條結果,因為在第3條的基礎上是可以直接匯入glance包的,第一條是當前py檔案所在的目錄。

總結:在包內啟動的時候,盡量不要使用相對路徑。

盡量在包外啟動。

Python3中的模組和包使用

包就好像我們的資料夾一樣,模組和包就像資料夾和檔案的關係,模組可以放在包裡。也可以不往裡面放 為什麼要劃分不同的模組?在同乙個模組中 量太大,的可讀性 避免變數名和函式名重複 模組應該怎麼去劃分?一般情況下 量不超過1000行 方法一 import test2 使用的時候 test2.login 方...

python3匯入類 Python筆記 匯入類

鎮貼圖自攝。被壓縮的好厲害呀 在家好無聊啊好無聊啊.匯入單個類 由於模擬較繁瑣,所以我們可以設定文件字串,形如 乙個可用於表示汽車的類 class car 一次模擬汽車的簡單嘗試 def init self,make,model,year self.make make self.model mode...

Python3中自定義包和匯入自定義包

第一篇部落格,寫得質量可能會不高,但希望能開個好頭,努力成為優秀的程式設計師!今天在惡補python基礎知識,發現我對包,庫,模組的定義非常模糊,於是我回頭看了一下基礎知識,也是一時興起想讓跟我一樣一開始有些困惑的人避坑!要想知道什麼是包,得先了解一下模組的概念!知道了模組,那緊接著看看包 上面是我...