【发布时间】:2020-08-24 01:42:31
【问题描述】:
我有一个具有一些固定结构的大型存储库,并且我通过一些文件夹和 python 脚本对其进行了扩展,以便为其整体添加额外的功能。结构如下:
- 顶级文件夹
- 功能A
- someModuleA.py
- __ 初始化 __.py
- 功能 B
- someModuleB.py
- __ 初始化 __.py
- 应用
- __ 初始化 __.py
- app.py
- 功能A
现在someModuleA.py 和someModuleB.py 可以通过app.py 调用,但同时也可以直接调用,但是这个调用必须来自顶层文件夹才能正确解析文件中的相对路径,即通过python ./featureA/someModuleA.py。
这一切都很好,但现在我需要来自someModuleB 的一些函数定义在someModuleA 中,因此我想导入这个模块。我已经尝试过绝对和相对导入,但都失败了不同的错误,绝对导入与
from toplevelfolder.featureA import someModuleA as A
# ModuleNotFoundError: No module named 'toplevelfolder'
和相对导入
from toplevelfolder.featureA import someModuleA as A
# ImportError: attempted relative import with no known parent package
现在我可以看到,当从toplevelfolder 调用python 时,相对导入会导致问题,因为.. 将代表后者的父目录,而不是featureA 的父目录。但是,我无法掌握第一条错误消息,特别是因为toplevelfolder 不应该是一个模块,而是一个包。
如果可能不修改 PYTHONPATH 或 sys.path 或类似的东西,是否有另一种我不知道的在 Python 中导入的方法?
【问题讨论】:
-
我建议将您的代码称为可执行模块,例如:
path/to/pythonX.Y -m toplevelfolder.app而不是path/to/pythonX.Y toplevelfolder/app.py。 -
@sinoroc 不能解决问题,我更感兴趣的是在顶层文件夹中运行
someModuleA而不是app。 -
它是否被称为
app或foo或bar都无关紧要。当然,您总是必须根据您自己的特定用例调整此处给出的答案。无论如何...如果您确保始终使用绝对导入,那么它应该可以工作。这是假设顶级包和模块确实在当前工作目录中或安装在 site packages 中。 -
粘贴到你的导入上方:` ``` import os,sys,inspect currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) parentdir = os.path.dirname(currentdir) sys.path.insert(0,parentdir) ```
-
不要乱用
sys.path,你应该试着把你的项目变成一个可安装的包:packaging.python.org/tutorials/packaging-projects
标签: python python-import python-module python-packaging