如何将相邻包正确导入python中的当前包?

Posted

技术标签:

【中文标题】如何将相邻包正确导入python中的当前包?【英文标题】:How to properly import neighboring package into current package in python? 【发布时间】:2022-01-16 00:24:14 【问题描述】:

我知道有一百万个类似的问题和文章描述了如何定义和管理包,但以下似乎不起作用,我已经没有东西可以尝试了。我希望我只是遗漏了一些对其他人来说完全显而易见的东西。

这是我目前的项目结构:

root-folder/
  |- app/
      |- cube/
          |- algorithms/
              |- __init__.py
              |- utils.py
              |- ...
          |- models/
              |- __init__.py
              |- cube.py
              |- ...
          |- __init__.py
          |- main.py
          |- README.md
      |- presentation/
          |- cli_test/
              |- __init__.py
              |- run.py
          |- unity/
              |- __init__.py
              |- producer.py
          |- __init__.py
          |- README.md
      |- __init__.py

我正在尝试将 app.cube 中的main.py 中的一个函数导入 app.presentation.unity 中的producer.py,如下所示:

from app.cube.main import run

但是当我尝试运行生产者文件时,它给了我以下信息:

$ python app/presentation/unity/producer.py
Traceback (most recent call last):
  File "app/presentation/unity/producer.py", line 3, in <module>
    from app.cube.main import run
ModuleNotFoundError: No module named 'app'

我尝试移动文件、重命名文件夹、添加和删除__init__.py 文件,但我总是遇到类似的问题。在当前设置中,所有的 init 文件都是空的。

另外需要注意的是,在我添加 presentation 文件夹之前,cube 文件夹曾经位于项目的根目录,并且我能够在 modelsalgorithms 模块并将 cube 模块中的内容导入根级别。从那时起,cube 文件夹的内容就没有改变过。这就像添加一个额外的层并不意味着工作或听起来很愚蠢。

对于一些最终信息,我在 MacOs Catalina(10.15.6) 上使用通过 pyenv 2.2.0 安装的 Python 3.8.5


解决方案!

正如本文第一条评论中所建议的那样,按如下方式运行它可以让您运行“作为脚本的库模块”,它现在对我有用!

python -m app.presentation.unity.producer

【问题讨论】:

您应该调用python -m app.presentation.unity.producer,以便根据Python解释器的命令行帮助运行“库模块作为脚本”。 约翰,这很好用!我什至不知道我可以运行这样的东西。非常感谢! 【参考方案1】:

试试这个 -

import sys 
sys.path.insert(1, '/root-folder/app/cube') 
from main import run

【讨论】:

对,我没有尝试过路径操作,因为我觉得应该有一种方法可以在没有任何 hacky 修复的情况下使其正常工作。

以上是关于如何将相邻包正确导入python中的当前包?的主要内容,如果未能解决你的问题,请参考以下文章

Python之路-包

如何检查 Python 包中的任何模块是不是从另一个包导入?

将 .java 文件导入正确的包中

Java中如何导入自己写的包

如何执行正确的 Python 来导入已安装的 tensorflow.transform 包?

尝试相对导入超出***包 python