我不知道我错过了什么,但我有以下项目结构:
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
我有两种情况:
- 绝对导入:当我运行时
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/
目录,但我们现在不考虑这个。)
如果您希望能够使用 Project/audio_classifier
不应该位于sys.path
中...
from audio_classifier 导入内容,
没有头痛。只有项目
应该。
这是一个简单的例子:
$ 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/