Python:导入语句中无法识别父包的名称

Vic*_*ard 6 python import package python-import python-3.x

我知道关于这个主题有很多问题,但我所看到的大多数答案都描述了在我看来应该很简单的问题的复杂解决方法。这是我的目录结构:

Mapper/
    LICENSE.txt
    README.txt
    setup.py
    bin/
        # nothing here, yet
    mapper/
        __init__.py
        process.py
        where.py
        # ...
        binconvert/
            __init__.py
            tocsv.py
            todict.py
            # ...
Run Code Online (Sandbox Code Playgroud)

我想在我所有本地开发的模块上使用绝对路径来减少混淆并避免这里提到的错误。

但是,我对此有多个问题。当我跑步时process.py,我import tocsv.py喜欢这样,

from mapper.binconvert import tocsv
Run Code Online (Sandbox Code Playgroud)

我收到错误: ModuleNotFoundError: No module named 'mapper'

我知道我可以做到from binconvert import tocsv,但就像我说的那样,我试图让所有本地开发的模块导入都使用绝对路径。

tocsv.py当我尝试where.py像这样导入时,我遇到了与以前相同的错误:

 from mapper import where
Run Code Online (Sandbox Code Playgroud)

对于这个,我相信有一些方法可以使用点语法 relative import,但同样,我想保持我所有的路径都是绝对的。毕竟,我相信按照python文档的这段话,我应该可以做到:

当包被构造成子包时(如示例中的声音包),您可以使用绝对导入来引用兄弟包的子模块。例如,如果模块sound.filters.vocoder需要在 中使用 echo 模块sound.effects package,则可以使用 from sound.effects import echo

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
              ...
Run Code Online (Sandbox Code Playgroud)

Céd*_*ien 3

当您执行时,process.py您已经位于映射器包内。Python 将查找定义的所有路径来sys.path查找模块,在本例中该模块仅由["standard python path", "Mapper/mapper"].

在这种情况下,python 将在这些目录中找不到名为 mapper 的模块(您已经位于 mapper 模块中)。

为您提供的解决方案:

  1. 使用符号:(from .binconvert import tocsv符合PEP 328
  2. 启动前从 1 个目录向上移动并process.py从该Mapper目录启动
  3. process.py在启动之前通过添加Mapper路径更改 PYTHONPATH 环境变量

  • 他不应该将“Mapper”目录添加到pythonpath中以便他可以“导入mapper”吗? (2认同)