Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python+;子模块:导入错误:尝试在没有已知父包的情况下进行相对导入_Python_Python 3.x_Git Submodules_Python Module_Pipenv - Fatal编程技术网

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

我一直在努力解决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.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

您可以在我的教程中找到此问题的解决方案