【发布时间】:2022-12-01 01:05:57
【问题描述】:
我是一位经验丰富的 Java 企业开发人员,但对 Python 企业开发商店还很陌生。我目前正在努力理解为什么有些导入有效而其他导入无效。
一些背景:我们的开发团队最近将 python 从 3.6 升级到 3.10.5,以下是我们的包结构
src/
bunch of files (dockerfile, Pipfile, requrirements.txt, shell scripts, etc)
package/
__init__.py
moduleA.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
tests/
__init__.py
test1.py
现在,在 module.by 中,我试图像这样导入子包 2/moduleS.py
from .subpackage2 import moduleZ
但是,我收到错误提示
ImportError: attempted relative import with no known parent package
有趣的是,如果我将 moduleA.py 移出 package/ 并移至 src/ 中,那么它就能找到所有内容。我不确定为什么会这样。
我通过执行 python package/moduleS.py 来运行 moduleA.py。
现在,我读到可能存在问题,因为如果将模块作为脚本运行(或那些行中的某些内容),您需要提供 -m 参数。但是,如果我这样做,我会收到以下错误:
ModuleNotFoundError: No module names 'package1/moduleA.py'
我什至尝试运行 package1/moduleA 并删除 .py,但这也不起作用。我能理解为什么我在技术上从未安装过它?
所有这一切都发生了,因为显然,测试失败了,为了让它工作,他们添加了相关的导入。他们将导入从“from subpackage2 import moduleZ”更改为“from .subpackage2 import moduleZ”,测试开始工作,但应用程序开始失败。
我能得到的任何理解将不胜感激。
【问题讨论】:
-
你安装包了吗?
-
您将您的目录结构描述为包含
package,但您的使用都是使用package1。请修复它,使两者一致(我假设它们在本地是一致的,而你只是在这里打错了其中一个)。 -
@juanpa.arrivillaga:他们已经说过他们还没有安装它:“我能理解为什么我在技术上从未安装过它?”它仍然可以工作,如果
sys.path包含src目录(例如因为它是工作目录)并且他们使用-m正确启动脚本的模块。 -
您是从该目录运行还是正在安装软件包?有没有说明如何打包安装的setup.py?
标签: python python-3.x python-import importerror