如何修复 ImportError:尝试在没有已知父包的情况下进行相对导入

Posted

技术标签:

【中文标题】如何修复 ImportError:尝试在没有已知父包的情况下进行相对导入【英文标题】:How to fix ImportError: attempted relative import with no known parent package 【发布时间】:2021-12-20 09:59:20 【问题描述】:

我正在为 FRC 开发一个“箍检测”程序,我想组织结构。我创建了__init__.pys,重新排列了导入并更新了路径。然后我运行了misc/calibration/ 中的代码。毕竟,我得到了错误:ImportError: attempted relative import with no known parent package。我尝试了一些东西,但都没有奏效。

这是我的项目树:

├── cascade.xml
├── images
│   ├── ref-pic.jpeg
│   └── ref-pic-post.jpeg
├── LICENSE
├── misc
│   ├── bash
│   │   ├── install_os_dependencies.sh
│   │   ├── pip_install.sh
│   │   └── set_camera.sh
│   ├── calibration
│   │   ├── __init__.py
│   │   ├── pixel-calculator.py
│   │   └── shoot-a-photo.py (This is the one I'm trying to run.)
│   ├── functions
│   │   ├── fix_camera.py
│   │   ├── __init__.py
│   │   └── set_camera.py
│   ├── __init__.py
│   └── viewer.py
├── requirements.txt
├── settings.ini
├── settings.ini.template
└── vision.py

5 directories, 19 files

这是我的导入声明:

from ..functions import set_camera

以及完整的错误信息:

Traceback (most recent call last):
  File "/home/egeakman/repos/vision-2021/misc/calibration/shoot-a-photo.py", line 7, in <module>
    from ..functions import set_camera
ImportError: attempted relative import with no known parent package

如果有用的话,这是项目存储库:https://github.com/Scorpions-Robotics/vision-2021

我应该以不同的方式导入它还是有其他方法? 提前致谢,祝您有美好的一天。

【问题讨论】:

你是如何运行代码的? @Mr_and_Mrs_D 与python shoot-a-photo.py 【参考方案1】:

我应该以不同的方式导入还是有其他方法?

不,导入没问题。它指示python转到父包(您正在运行的文件所在的包),它会在那里找到另一个名为functions的包,然后是from there import set_camera。但正如错误消息所说:

尝试在没有已知父包的情况下进行相对导入

python 找不到 父包 来进行相对导入。该父 package 不是(出于技术原因,例如导入挂钩,不能是)您正在运行的文件的父 目录。一方面,python 必须扫描整个文件系统才能找到可能的包。相反,python 扫描它运行的目录,在这种情况下,calibration 找不到父包(或实际上任何包结构)并且繁荣。所以是的,还有另一种方法 - 为 python 提供您要运行的模块的完全限定名称。为此,您需要首先将 shoot-a-photo.py 文件重命名为有效的模块名称 shoot_a_photo.py。然后 cd 到misc 的父目录并使用-m 开关:

$ cd ../..
$ ls
cascade.xml images LICENSE misc ...
$ python -m misc.calibration.shoot_a_photo # note no py

这告诉 python 运行 module(不是 file)shoot_a_photo,它是包 misc.calibration 的一部分。包misc 将被检测为工作目录的直接子级,包含一个__init__.py 文件,并且它的子包将被索引。

-m 开关是运行作为包一部分的 python 脚本的规范方式

【讨论】:

以上是关于如何修复 ImportError:尝试在没有已知父包的情况下进行相对导入的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:尝试在没有已知父包的情况下进行相对导入(Python 3)

尝试在没有已知父包的情况下进行相对导入

pip install, 如何修复 ImportError

如何修复“ImportError:无法导入名称 IncompleteRead”?

如何修复相对导入错误:“没有已知的父包”?

import pymongo 导致“ImportError: cannot import name BSON”。你如何修复导入错误?