首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制关于模块和包内导入的官方Python3教程,但仍然接收ImportError和SystemError异常。

复制关于模块和包内导入的官方Python3教程,但仍然接收ImportError和SystemError异常。
EN

Stack Overflow用户
提问于 2016-07-16 05:36:04
回答 1查看 584关注 0票数 2

我遵循Python 3模块教程,我无法获得绝对或相对的包内导入工作。

具体来说,我从教程中复制了项目结构。sound文件夹位于我的主/home/user/目录中。所有项目文件(不包括filters/vocoder.pyeffects/surround.py)都是空的,并且是使用touch生成的。

代码语言:javascript
复制
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包含:

代码语言:javascript
复制
from sound.effects import echo

执行此文件时,它将导致导入错误:

代码语言:javascript
复制
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中分别执行了以下每一行代码(我将行注释掉#并重新运行脚本):

代码语言:javascript
复制
from . import echo
from .. import formats
from ..filters import equalizer

在执行时,其结果是:

代码语言:javascript
复制
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

我做错了什么,为什么我不能让绝对和相对进口在我的包中工作呢?

下面是一个应该有助于复制项目的脚本:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-16 06:15:55

我只是在看教程。我不读到from sound.effects import echo应该像filters/vocoders.py一样工作。本教程中的内容是:

包的用户可以从包中导入各个模块,例如:

代码语言:javascript
复制
import sound.effects.echo

因此,这就好像用户可以从当前目录引用sound目录一样。正如一些注释所述,要做到这一点,用户需要与sound位于同一个目录中,或者将sound目录添加到PATH变量中。如下所示:

代码语言:javascript
复制
import sys
sys.path.append( <path to sound> )
from sound.effects import echo

另见:从相对路径导入模块

在接下来的教程中,他们会谈到您想要做的事情,即包内引用。您可以在不将sound添加到PATH的情况下使用此技术。

例如,从filters/vocoders.py模块导入echo应该是可行的。

代码语言:javascript
复制
from ..effects import echo
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38408123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档