Python 3:将子包导入顶级包的问题
我不知道我缺少什么,但我有以下项目结构:Python 3:将子包导入顶级包的问题,python,python-3.x,Python,Python 3.x,我不知道我缺少什么,但我有以下项目结构: Project |audio_input |output_files |audio_classifier ||________________ |__init__.py |base.py |preprocessing ||_____________ |__i
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\u classifier
是我的源根目录,base.py内容是:
导入系统
导入操作系统
打印(系统路径)
打印(名称、包装)
从audio_classifier.preprocessing.input_preparation导入InputPreparation
我有两种情况:
python-m base
时,出现以下错误:
ModuleNotFoundError:没有名为“音频分类器”的模块
但这确实让我困惑,因为我在顶级包中已经有了一个\uuu init\uuuu.py
。难道它不应该被承认吗sys.path
包含路径['/home/$USER/Project/audio_classifier',…],那么它不应该使用绝对导入工作吗?
实际上,\uuuuuuuuuuuuuuuuuuu
是空的
.preprocessing.input\u preparation导入InputPreparation
用于来自的.preprocessing.input\u preparation导入InputPreparation
现在,我收到以下错误:ImportError:尝试在没有已知父包的情况下进行相对导入
这与python没有将我的顶级包标识为包的问题根源相同
注意:当使用PyCharm运行base.py时,第一个选项实际上起作用。但是源根、环境和路径与我在终端上运行的相同。我一定错过了一些非常重要的事情
我试图了解numpy和librosa这样的大型图书馆是如何组织它们的存储库的,并试图将这一概念引入我自己的repo中,但复制他们的方法让我犯了这些错误,我现在真的无法克服这些错误
各位,先谢谢你们
编辑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软件包”]
- 您的“源根”(用PyCharm术语)应该位于setup.py等所在的位置(即图中的
)。这是你将要放置所有包裹的地方。(有些存储库有一个额外的Project/
目录,但现在我们不要考虑这个。)src/
应该不在项目/audio\u分类器
,如果您希望能够从audio\u分类器导入带有系统路径中
而不会头痛。只有的内容…
才应项目
$mkdir ac#创建包目录
$touch ac/_init__.py#创建包初始化文件,使其成为包
$echo'来自.foo import baz'>ac/base.py#在包中创建一个模块
$mkdir ac/foo#创建子包
$echo'baz=8'>ac/foo/_init__.py#在子包中创建包初始化文件
$echo-e'from.base import baz\n print(baz)>ac/_umain_uu.py#创建一个可与`-m一起运行的_umain_uuu_u文件`
$python-m ac
8.
$
结构看起来像
$tree-I'*.pyc'
.
└── 交流电
├── __初始值
├── __主管道
├── base.py
└── 福
└── __初始值
事情也是互动的:
>>导入ac
>>>进口交流电源
>>>将ac.foo作为f导入
>>>巴兹
8.
>>>ac.base.baz
8.
- 您的“源根”(用PyCharm术语)应该位于setup.py等所在的位置(即图中的
)。这是你将要放置所有包裹的地方。(有些存储库有一个额外的Project/
目录,但现在我们不要考虑这个。)src/
应该不在项目/audio\u分类器
,如果您希望能够从audio\u分类器导入带有系统路径中
而不会头痛。只有的内容…
才应项目
$mkdir ac#创建包目录
$touch ac/_init__.py#创建包初始化文件,使其成为包
$echo'来自.foo import baz'>ac/base.py#在包中创建一个模块
$mkdir ac/foo#创建子包
$echo'baz=8'>ac/foo/_init__.py#在子包中创建包初始化文件
$echo-e'from.base import baz\n print(baz)>ac/_umain_uu.py#创建一个可与`-m一起运行的_umain_uuu_u文件`
$python-m ac
8.
$
结构看起来像
$tree-I'*.pyc'
.
└── 交流电
├── __初始值
├── __主管道
├── base.py
└── 福
└── __初始值
事情也是互动的:
>>导入ac
>>>进口交流电源
>>>将ac.foo作为f导入
>>>巴兹
8.
>>>ac.base.baz
8.
你的PYTHONPATH看起来像什么?更新了问题以包含$PYTHONPATH。你的PYTHONPATH看起来像什么?更新了问题以包含$PYTHONPATH。感谢你回答AKX。这不违背《搭便车指南》的解释吗?就项目结构而言,这看起来真的不是一个明智的选择。我更喜欢保持这个结构的原样,隔离测试、静态资源、输入、输出等。在我看来,它们都不属于根命名空间。好吧,我真的希望保持项目结构的原样,作为个人选择。所以@AKX给了我一些宝贵的资源来深入挖掘。我一直试图解决这个问题,但发现了我的错误:我试图从包的内部调用它。所以,我想我有两个选择:1。在我的示例文件夹中,我编写了一个脚本,使用import audio\u classifier…
2将我的音频分类器作为一个包使用。我做了一些argparsing以将包用作CLI工具。作为python-m audio\u classifier args--flags运行包时的入口点是uu main\uuuu.py。如果有人遇到与我相同的问题,为了完成此操作: