[英]Replicated the official Python 3 tutorial on Modules and intra-package imports and still receiving ImportError and SystemError exceptions
我遵循了Python 3 Modules教程 ,但無法使絕對或相對的包內導入正常工作。
具體來說,我從教程中復制了項目結構。 sound
文件夾位於我的主目錄/home/user/
目錄中。 所有項目文件(不包括filters/vocoder.py
和effects/surround.py
)都是空的,並且是通過touch
生成的。
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
按照指令, filters/vocoder.py
包含:
from sound.effects import echo
執行此文件時,將導致導入錯誤:
user@pc:~/sound$ python filters/vocoder.py
Traceback (most recent call last):
File "filters/vocoder.py", line 1, in <module>
from sound.effects import echo
ImportError: No module named 'sound'
user@pc:~/sound$ cd filters/
user@pc:~/sound/filters$ python vocoder.py
Traceback (most recent call last):
File "vocoder.py", line 1, in <module>
from sound.effects import echo
ImportError: No module named 'sound'
同樣,我已經分別在effects/surround.py
執行了以下每行代碼(我在#
注釋了這些行並重新運行了腳本):
from . import echo
from .. import formats
from ..filters import equalizer
執行時會導致:
user@pc:~/sound$ python effects/surround.py
Traceback (most recent call last):
File "effects/surround.py", line 1, in <module>
from . import echo
SystemError: Parent module '' not loaded, cannot perform relative import
user@pc:~/sound$ cd effects/
user@pc:~/sound/effects$ python surround.py
Traceback (most recent call last):
File "surround.py", line 1, in <module>
from . import echo
SystemError: Parent module '' not loaded, cannot perform relative import
我在做錯什么,為什么不能在軟件包中使用絕對導入和相對導入?
下面是一個腳本,該腳本應有助於復制項目:
mkdir ~/sound
touch ~/sound/__init__.py
mkdir ~/sound/formats
touch ~/sound/formats/__init__.py
touch ~/sound/folder/wavread.py
touch ~/sound/folder/wavwrite.py
touch ~/sound/folder/aiffread.py
touch ~/sound/folder/aiffwrite.py
touch ~/sound/folder/auread.py
touch ~/sound/folder/auwrite.py
mkdir ~/sound/effects
touch ~/sound/effects/__init__.py
touch ~/sound/folder/echo.py
touch ~/sound/folder/surround.py
touch ~/sound/folder/reverse.py
mkdir ~/sound/filters
touch ~/sound/filters/__init__.py
touch ~/sound/folder/equalizer.py
touch ~/sound/folder/vocoder.py
touch ~/sound/folder/karaoke.py
echo "from sound.effects import echo" >> ~/sound/filters/vocoder.py
echo "from . import echo" >> ~/sound/effects/surround.py
echo "from .. import formats" >> ~/sound/effects/surround.py
echo "from ..filters import equalizer" >> ~/sound/effects/surround.py
我只是在看教程。 我沒有 from sound.effects import echo
讀取它應該像從filters/vocoders.py
from sound.effects import echo
中那樣工作。 教程中所說的是:
包的用戶可以從包中導入各個模塊,例如:
import sound.effects.echo
這樣就好像用戶可以從其當前目錄引用sound
目錄一樣。 就像一些評論所說的那樣,為了做到這一點,用戶需要與sound
在同一目錄中或將sound
目錄添加到PATH
變量中。 像這樣:
import sys
sys.path.append( <path to sound> )
from sound.effects import echo
另請參閱: 從相對路徑導入模塊
在本教程的后續部分,他們觸及了您要嘗試做的事情,即包內引用 。 您可以在不向PATH
添加sound
情況下使用此技術:
例如,從您的filters/vocoders.py
模塊中,這應該可以導入echo
:
from ..effects import echo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.