## Python中的Package和Jupyter中import包問題


前言

關於python包的一些知識


Java中的package概念

我們知道在java中的import package概念, java中的包就是一個目錄,里面包含着子目錄,子目錄套着子目錄,當需要引入下層包的時候,需要加一個點以表示分層的概念例如

├─ aaa
├─bbb
│ └─ccc
└─ddd

我們在根目錄下,當我們想引用ccc中的ccc中的class的時候,我們可以這樣寫

import bbb.ccc.* 

Python中的包

總體來說python的包機制與Java的差不多,都是目錄的形式,不過里面都是py文件

一個標准的Python包

一個標准的Python Package A 應該至少在A目錄下包含__init.py__ 文件,例如

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py

這樣的sound包中包含了了3個包,首先sound目錄下有_init_.py文件,sound包中包含formats, effects和filters三個包,formats,effects 和filters。 init.py的作用主要是在import python的包的時候做一些初始化工作例如可以這樣寫

    __all__ = ['wavread', 'wavwrite']

如果在formats的init里面寫了這句話,表明from sound.formats import * 的時候, 只會引入wavwrite, wavread兩個Module。

其他py文件對Module的引用


引用python包的語法主要有兩種

import sound

或者

from sound.formats import func

對於第一種寫法,表明引入的是整個module,接下來可以使用sound.format.func, 對於第二種寫法,from后面必須精確到某個py文件,import表示引入py文件中的某個對象(或是某個類和函數,當然python中函數也是對象)注意,這么寫是相對路徑,也就是說,能不能引入到你想要的包,和你當前py文件在哪個包很有關系,例如現在在echo.py中想引入formats/wavread.py中的func,必須這么寫

from ..formats.wavread import func
func()

參考了這篇博文后需要注意,含有相對路徑的py文件是不能直接運行的(包括直接python echo.py或是在sublime中cntl + B等等方法),原因是直接執行python腳本會讓該腳本的_name__值變成_main__會影響到相對路徑的引用,報錯__Attempted relative import in non-package,因此,若是一定需要執行某腳本,必須手動的將當前目錄的上層引入,代碼如下

import sys
sys.path.append('../')
from ..formats.wavread import func
func()

這樣就可以直接運行


待續未完。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM