Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3:将子包导入顶级包的问题_Python_Python 3.x - Fatal编程技术网

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 我有两种情况:

  • Absolute import:在audio\u分类器文件夹中运行
    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。如果有人遇到与我相同的问题,为了完成此操作: