我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:
name_of_my_app/
__init__.py
main.py
config.ini
CONFIG.py
motors/
__init__.py
one_kind_of_motor.py
measurement_devices/
__init__.py
one_kind_of_measurement_device.py
我想要一个配置文件(ini)来存储电机和测量设备的设置。
我从 u/symmitchry 在 Reddit 帖子上的答案开始:| ||https://www.reddit.com/r/learnpython/comments/2hjxk5/whats_the_proper_way_to_use_configparser_across/
因为这似乎是最明智的做法。据我了解,我可以将
与
config.ini
一起放在应用程序的根目录中。
CONFIG.py
将负责从
CONFIG.py
读取设置,并通过导入
config.ini
使它们可用。 。当我从
CONFIG.py
导入配置时,这有效。但是,当我尝试从
main.py
导入配置时:
one_kind_of_motor.py
按照@f3lix在这篇文章中的建议:
from ... import CONFIG
从父文件夹导入模块 ,我得到: 那就是当我在根目录添加
ImportError: attempted relative import with no known parent package
希望它能解决我的问题,但没有。我也尝试过用
__init__.py
和
..
而不是
.
,它所做的唯一的事情就是表明我对这个主题的了解是多么的少......(它不断抛出上面相同的错误)。
...
目前,为了解决这个问题,我从每个文件中读取了我需要的具体设置。但我知道它不是最优的。
我像科学家一样用 Python 编程,即我没有软件开发人员背景,我通常使用基本的 Python,但我想学习传播我的研究的干净方法。我看过很多关于类似问题的帖子(你可以为此打电话给我),但我无法理解他们的答案。您能用外行人的术语向我解释一下吗?
config.ini
编辑:
为了回应@ImpeccableChicken 的全面回答,我创建了一个简化的文件结构并将其上传到 GitHub
以演示问题。使用 会产生错误 我使用的是 Windows 计算机,并且从 Visual Code 执行脚本。 to demonstrate the problem. Using
from .. import CONFIG
produces an error
ImportError: attempted relative import with no known parent package
I am using a Windows machine and I execute my scripts from Visual Code.
在尝试从软件包外部运行代码时遇到相对导入问题。可以通过以下两种方法之一解决此问题:
方法 1:作为软件包运行
最干净的方法是从的软件包中运行代码,将其视为一个软件包。为此,请使用
-m
标志运行
main.py
:
- 打开终端或命令提示符。
-
导航到
name_of_my_app
的父目录。 - 运行以下命令:
bash
python -m name_of_my_app.main
这会将
name_of_my_app
作为软件包运行,并正确解析相对导入。
方法 2:修改
sys.path
或者,可以通过将
name_of_my_app
的父目录添加到
sys.path
来修改 Python 的导入路径。这是解决方法,但在某些情况下可能有用:
-
在
main.py
的开头添加以下代码:
```python import sys import os
sys.path.append(os.path.dirname(os.path.abspath( file )))
from . import CONFIG ```
这会将
main.py
所在目录的父目录添加到
sys.path
,从而允许使用相对导入导入
CONFIG
。
其他建议:
-
确保的
__init__.py
文件为空或仅包含必要的初始化代码。 -
考虑使用绝对导入而不是相对导入以提高可读性和避免潜在问题,尤其是在大型项目中。例如,可以在
main.py
中使用from name_of_my_app import CONFIG
。
请记住,最佳方法取决于的特定需求和项目结构。如果可能,最好将的应用程序作为软件包运行以确保正确处理导入。
标签:python,import,configuration,relative-import From: 78764500