首页 > 编程问答 >Python应用程序跨子包共享的配置文件

Python应用程序跨子包共享的配置文件

时间:2024-07-21 03:23:09浏览次数:12  
标签:python import configuration relative-import

我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:

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

  1. 打开终端或命令提示符。
  2. 导航到 name_of_my_app 的父目录。
  3. 运行以下命令:

bash python -m name_of_my_app.main

这会将 name_of_my_app 作为软件包运行,并正确解析相对导入。

方法 2:修改 sys.path

或者,可以通过将 name_of_my_app 的父目录添加到 sys.path 来修改 Python 的导入路径。这是解决方法,但在某些情况下可能有用:

  1. 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

相关文章

  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......
  • 调试用 C 编写的 Python 扩展
    我非常熟悉编写C代码,并且很擅长编写Python代码。我正在尝试学习如何用C编写可以从OSX10.15.7上的Python-3.9.X调用的模块。我已经得到了几个“helloworld”类型的示例,但是对于复杂的示例,我正在努力弄清楚如何调试我编写的C扩展。MWE:src/add.c//......
  • 具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误
    我有一个非常大的SAS文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用pandas中chunksize方法的read_sas选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。此特定SAS文件有794......
  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......
  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......
  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......