【问题标题】:The exact code from python documentation doesn't work! (Importing modules)python文档中的确切代码不起作用! (导入模块)
【发布时间】:2021-09-21 20:47:06
【问题描述】:

我在导入模块时遇到问题,这里解释了 https://docs.python.org/3/tutorial/modules.html

我创建了像 here 这样的确切文件

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
              ...

我在每个文件中定义了一个变量,如下所示:in_<filename> = 'in <filename>'
例如在sound/effects/echo.py 我有in_echo = 'in echo'

现在您可以在第 1 段中看到 here

例如,如果模块 sound.filters.vocoder 需要使用 echo sound.effects 包中的模块,可以使用from sound.effects import echo

所以我这样修改sound/filters/vocoder.py

from sound.effects import echo


print(echo.in_echo)

in_vocoder = 'in vocoder'

但是当我运行vocoder.py 时,我得到了这个错误:

$ python3 -u "/home/something/sound/filters/vocoder.py"
Traceback (most recent call last):
  File "/home/something/sound/filters/vocoder.py", line 1, in <module>
    from sound.effects import echo
ModuleNotFoundError: No module named 'sound'

并且正如您在同一部分中看到的那样,在第 2 段中

例如,从环绕模块中,您可以使用:

from . import echo
from .. import formats
from ..filters import equalizer

所以我这样修改sound/effects/surround.py

from . import echo


print(echo.in_echo)

in_surround = 'in surround'

但是当我运行surround.py 时,我得到了这个错误:

$ python3 -u "/home/something/sound/effects/surround.py"
Traceback (most recent call last):
  File "/home/something/sound/effects/surround.py", line 1, in <module>
    from . import echo
ImportError: attempted relative import with no known parent package

这些也一样

from .. import formats
from ..filters import equalizer

我很困惑,我希望能解释一下为什么 python 文档中的确切代码不起作用!!!

非常感谢您的宝贵时间

【问题讨论】:

  • 你安装了声音库吗?尝试进行 pip 安装。
  • 你没有抓住重点。他们正在创建这个包。
  • @HenryCWong 我的朋友是本地文件!!!
  • @TimRoberts 你是什么意思。我应该怎么做才能创建包?据我所知,当我们有一些模块时,我们称它们为包。
  • 那是一个包,叫做“声音”。它旨在作为一个单元使用。您正在尝试自己运行该包的元素之一。这不是预期的用例。

标签: python python-3.x import python-import importerror


【解决方案1】:

您正在阅读的教程是关于当另一个包使用import sound 导入整个库时。在这种情况下,引用工作,因为它有一个起点。如果您在包的深处运行单个脚本,它将不起作用。包不应该是这样工作的。

现在,您可以完成这项工作。如果您需要“vocoder.py”自行运行,您只需在导入前将顶级目录添加到路径中即可。如:

import os
import sys
sys.path.append( os.path.abspath( os.path.basename(__file__) + "../.."))

现在您可以导入“effects.echo”,例如。

【讨论】:

  • 先生,import sound 的意义何在?可以访问它的变量和函数等(如果我错了,请纠正我)。因此,当我在与sound 位于同一目录中的文件中添加import sound 时,我必须能够访问sound 中的所有内容。但是,如果我使用其中一种方法,我仍然无法访问变量。例如sound.filters.vocoder.echo.in_echo
  • 阅读docs.python.org/3/tutorial/modules.html#packages 中解释如何导入包中的单个模块的部分。
  • import sound 将被一些想要使用此包中的设施的其他应用程序使用。该应用程序必须确保您的顶级目录位于路径上。在包内,您必须使用其他方法在目录之间移动。请记住,您所拥有的不是应用程序。这是一个供其他应用程序使用的库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2015-04-30
  • 2023-02-09
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多