Import函數
下面是包的結構spa
package ├── __init__.py ├── subpackage1 │ ├── __init__.py │ ├── moduleX.py │ └── moduleY.py ├── subpackage2 │ ├── __init__.py │ └── moduleZ.py └── moduleA.py
咱們如今在moduleX.py中。code
有絕對路徑引入和相對路徑引入兩種方法。相對路徑對於絕對路徑來講優點爲: 當調整模塊和包的時候若是是絕對路徑那麼須要一個個挨着改。絕對路徑對於相對路徑來講優點爲:相對路徑取決於當前的包,因此在哪裏執行就會有不同的難以預料的後果(from . import module error: main is not a package。相對引用的' . '符號對應的就是__name__的值。若是在main函數中執行這個' . '就是__main__而不是上級包名。此時用from baoming import module就能解決)。 下面來導入一些包:[A]表示絕對路徑 | [B]表示相對路徑。it
導入同一個子包下的 moduleYimport
[A] from package.subpackage1 import moduleYmodule
[B] from . import moduleY循環
導入同一個子包下的 moduleY.py中的spam函數引用
[A] from package.subpackage1.moduleY import spam方法
[B] from .moduleY import spamim
從兄弟子包下的moduleZ中導入func函數
[A] from package.subpackage2.moduleZ import func
[B] from ..moduleZ import func
導入父包下的moduleA
[A] from package import moduleA
[B] from .. import moduleA 或from ...package import moduleA
引用中有一個最多見的錯誤就是:循環引用
A.py from .B import B_greet_back def A_say_hello(): print('A says hello!') B_greet_back() def A_greet_back(): print('A says hello back!') if __name__ == '__main__': A_say_hello() B.py from .A import A_greet_back def B_say_hello(): print('B says hello!') A_greet_back() def B_greet_back(): print('B says hello back!') if __name__ == '__main__': B_say_hello()
此時會有引用錯誤:ImportError: cannot import name 'A_greet_back'
[解決辦法]
1.能夠引用整個包而不是指定引用包裏的函數
更改 b.py from .A import A_greet_back 爲 from . import A
2.延遲引用
B.py def B_say_hello(): from .A import A_greet_back print('B says hello!') A_greet_back() def B_greet_back(): print('B says hello back!') if __name__ == '__main__': B_say_hello()