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