簡體   English   中英

復制了有關模塊和包內導入的官方Python 3教程,並且仍然收到ImportError和SystemError異常

[英]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.pyeffects/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM