How to fix ImportError: attempted relative import with no known parent package

How to fix ImportError: attempted relative import with no known parent package

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

这是我的项目树:

├── 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

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

Should I import it differently or is there another way?

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

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

python 无法找到 父包 来进行相对导入。那个父 package 不是(并且出于技术原因,比如导入挂钩,不能是)你所在的文件的父 directory 运行宁。其一,python 必须扫描整个文件系统以找到可能的包。相反,python 扫描它来自 运行 的目录,在这种情况下 calibration 找不到父包(或实际上任何包结构)和 boom。所以是的,还有另一种方法 - 给 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 运行 模块(不是 文件)shoot_a_照片谁是包 misc.calibration 的一部分。包 misc 将被正确检测为工作目录的直接子项,包含一个 __init__.py 文件,其子包将被索引。

-m 开关是 运行 将 python 脚本作为包的一部分

的规范方式