Python 3 : Issue importing subpackages to top-level package

标签 python python-3.x

我不知道我错过了什么,但我有以下项目结构:

Project
|audio_input
|output_files
|audio_classifier
||________________
                 |__init__.py
                 |base.py
                 |preprocessing
                 ||_____________
                                |__init__.py
                                |base.py
                                |input_preparation.py
                                |_feature_extraction.py
                 |classification
                 |______________
                                |__init__.py
                                |classifier_gpu_enabled.py
                                |_nn_architectures.py   
|docs
|examples
|tests
|README
|req.txt
|setup.py

audio_classifier是我的源根目录,base.py 内容是:

import sys
import os

print(sys.path)
print(__name__, __package__)

from audio_classifier.preprocessing.input_preparation import InputPreparation

我有两种情况:

  1. 绝对导入:当我运行时 python -m base在audio_classifier文件夹中我收到以下错误: ModuleNotFoundError: No module named 'audio_classifier' 但这真的让我很困惑,因为我已经有一个 __init__.py在顶级包上。难道不应该被认可吗?

sys.path包含路径 ['/home/$USER/Project/audio_classifier', ...],那么它不应该使用绝对导入来工作吗? 确实__package__为空。

  • 相对导入:替换 from audio_classifier.preprocessing.input_preparation import InputPreparation对于 from .preprocessing.input_preparation import InputPreparation现在我收到以下错误:
  • ImportError: attempted relative import with no known parent package 它有同样的问题根源,Python 没有将我的顶级包识别为包。

    注意:第一个选项实际上在使用 PyCharm 运行 base.py 时有效。但源根、环境和路径与我在终端上运行的相同。我一定错过了一些非常重要的东西。

    我试图了解 numpy 和 librosa 这样的大型库如何组织他们的存储库,并试图将这个概念带到我自己的存储库中,但是复制他们的方法给我带来了这些错误,我真的无法在时刻。

    提前谢谢你们,伙计们。

    编辑1: PYTHONPATH: ['', '$HOME/.conda/envs/ac/lib/python37.zip', '$HOME/.conda/envs/ac/lib/python3.7', '$HOME/.conda/envs/ac/lib/python3.7/lib-dynload', '$HOME/.conda/envs/ac/lib/python3.7/site-packages']

    最佳答案

    • 您的“源根目录”(在 PyCharm 术语中)应该是您的 setup.py 等所在的位置(即图表中的 Project/ )。这是您放置所有包裹的地方。 (有些存储库有一个额外的 src/ 目录,但我们现在不考虑这个。)
    • 如果您希望能够使用 from audio_classifier 导入内容,
    • Project/audio_classifier 不应该位于 sys.path 中... 没有头痛。只有项目应该。

    这是一个简单的例子:

    $ mkdir ac  # create a package directory
    $ touch ac/__init__.py  # create the package init file so it's a package
    $ echo 'from .foo import baz' > ac/base.py  # create a module in the package
    $ mkdir ac/foo  # create a subpackage
    $ echo 'baz = 8' > ac/foo/__init__.py  # create a package init file in the subpackage
    $ echo -e 'from .base import baz\nprint(baz)' > ac/__main__.py  # create a __main__ file that can be run with `-m`
    $ python -m ac
    8
    $
    

    结构如下

    $ tree -I '*.pyc'
    .
    └── ac
        ├── __init__.py
        ├── __main__.py
        ├── base.py
        └── foo
            └── __init__.py
    

    并且事物也可以交互工作:

    >>> import ac
    >>> import ac.base
    >>> import ac.foo as f
    >>> f.baz
    8
    >>> ac.base.baz
    8
    

    关于Python 3 : Issue importing subpackages to top-level package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55748383/

    相关文章:

    python - 在两个应用程序之间使用 url_for

    python - 方法解析顺序 (__mro__) 在 Python3.x 中不可用?

    python - 在python中填充两条曲线之间的区域

    python - 从过滤器返回第一个元素或无

    python - 循环年份,同时跳过某些月份

    python - 使用 Python 将 BLOB 图像转换为 PNG、JPG

    python - 检索具有标签的元素 - Python 中的 XML

    python - Canopy 获取 shell 中的文件列表

    django - 嵌套序列化程序 django rest 框架中的上下文

    python - Python中Decimal类型的说明