如何将相邻包正确导入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
文件夹曾经位于项目的根目录,并且我能够在 models
和algorithms
模块并将 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 包中的任何模块是不是从另一个包导入?