Python+;子模块:导入错误:尝试在没有已知父包的情况下进行相对导入
我一直在努力解决python上的相对导入问题 我的项目结构如下所示:Python+;子模块:导入错误:尝试在没有已知父包的情况下进行相对导入,python,python-3.x,git-submodules,python-module,pipenv,Python,Python 3.x,Git Submodules,Python Module,Pipenv,我一直在努力解决python上的相对导入问题 我的项目结构如下所示: root_dir ├── main.py ├── Pipfile ├── Pipfile.lock ├── unit_tests │ ├── __init__.py │ ├── test_first.py │ └── test_second.py └── my_package ├── __init__.py ├── first.py ├── second.py └── third.p
root_dir
├── main.py
├── Pipfile
├── Pipfile.lock
├── unit_tests
│ ├── __init__.py
│ ├── test_first.py
│ └── test_second.py
└── my_package
├── __init__.py
├── first.py
├── second.py
└── third.py
我想将一组函数从位于my_package
中的文件导入test_first.py
根据标准,语法应如下所示:
from ..my_package import first
当我这样做时,我会得到以下异常:
Traceback (most recent call last):
File "/home/user/dev/root_dir/my_package/unit_tests/first.py", line 8, in <module>
from ..my_package import first
ImportError: attempted relative import with no known parent package
ModuleNotFoundError: No module named 'root_dir'
当我这样做时,我会得到以下异常:
Traceback (most recent call last):
File "/home/user/dev/root_dir/my_package/unit_tests/first.py", line 8, in <module>
from ..my_package import first
ImportError: attempted relative import with no known parent package
ModuleNotFoundError: No module named 'root_dir'
必须指出的是,我正在使用pipenv
来处理虚拟环境。
知道为什么会这样吗
谢谢。我想你需要做“我的包裹”。使用三个“…”
“.”表示父根目录。最后一个“.”正在访问子文件夹my_package。。使用os.getcwd()
查看它是什么,但很可能是root\u dir
在这种情况下,您可以直接按名称导入顶级包,而无需相对导入;您应该直接从my_package
导入,如下所示:
首先从my_程序包导入
…或:
从我的\u包。首先导入做什么
复制的文件树:
root_dir
├── main.py
├── my_package
│ ├── __init__.py
│ └── first.py
└── unit_tests
├── __init__.py
└── test_first.py
main.py的内容
:
从单元测试首先导入测试
如果名称=“\uuuuu main\uuuuuuuu”:
先测试,先测试
如果您尝试进行相对导入,即:from..my_package import first
,您将获得:
ImportError: attempted relative import beyond top-level package
首先,我会给你我用过的代码。然后,我会做一个简单的解释。这里有一个简短的函数,可以让您从根目录导入 解决方案 导入操作系统,系统 def访问根目录(深度=1): current_dir=os.path.dirname(os.path.realpath(uu文件_uu)) 父目录=os.path.dirname(当前目录) args:list=[parent\u dir] 对于uuu范围内(深度): args.append(“..”) rel_path=os.path.join(*args) sys.path.append(rel_path) #在test_first.py的顶部 访问根目录目录(2) 导入根目录 由于根目录是
test\u first.py
的祖辈目录,因此需要转到深度2:
解释
我在我的一个项目中遇到了同样的问题,并发现
通过更改sys.path
,可以修复从父目录导入的问题。将绝对路径附加到根目录
sys.path.append(abs\u path\u to\u root)
似乎不起作用,除非所有内容都是包的一部分。默认情况下,Python不会访问导入中的父目录
#案例1:到父级的相对路径-工作
current_dir=os.path.dirname(os.path.realpath(uu文件_uu))
相对路径=os.path.join(当前路径“…”)
sys.path.append(相对路径)
导入父模块名称这对我来说很有用(Python 3.9)
#案例2:到父级的绝对路径-不起作用
current_dir=os.path.dirname(os.path.realpath(uu文件_uu))
父目录=os.path.dirname(当前目录)
sys.path.append(父目录)
导入父模块名称会引发ModuleNotFoundError
您可以在我的教程中找到此问题的解决方案