在 python 包中添加和读取 config.ini 文件

2023-11-27

我正在编写我的第一个 python 包,我想将其上传到 PyPI 上。我基于此构建了我的代码博客文章.

我想将用户设置存储在 config.ini 文件中。在同一包中的单独 python 模块中读取一次(每次运行包时),并将用户设置保存在该模块的全局变量中。稍后将其导入其他模块中。

为了重现错误,我只是在博客文章中描述的模板中编辑了几行代码。 (请参考它,因为重新创建整个有问题的内容需要太多的输入。)

唯一的区别是我的stuff.py像这样从配置文件中读取:

from ConfigParser import SafeConfigParser

config = SafeConfigParser()
config.read('config.ini')

TEST_KEY = config.get('main', 'test_key')

以下是内容config.ini(放置在与stuff.py):

[main]
test_key=value

And my bootstrap.py只需导入并打印TEST_KEY

from .stuff import TEST_KEY

def main():
    print(TEST_KEY)

但是在执行包时,导入失败并出现此错误

Traceback (most recent call last):
    File "D:\Coding\bootstrap\bootstrap-runner.py", line 8, in <module>
    from bootstrap.bootstrap import main
    File "D:\Coding\bootstrap\bootstrap\bootstrap.py", line 11, in <module>
    from .stuff import TEST_KEY
    File "D:\Coding\bootstrap\bootstrap\stuff.py", line 14, in <module>
    TEST_KEY = config.get('main', 'test_key')
    File "C:\Python27\Lib\ConfigParser.py", line 607, in get
    raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'main'

进口不断给予ConfigParser.NoSectionError,但是如果你只构建/运行 stuff.py(我使用 sublime3),该模块不会给出错误并打印TEST_KEY gives value作为输出。

另外,当我只在目录中使用 3 个文件(config、stuff、main)并仅将 main 作为脚本执行时,这种导入方法确实有效。但我必须像这样导入它

from stuff import TEST_KEY

我只是使用该文章中描述的显式相对导入,但对这些没有足够的理解。我猜错误是由于项目结构和导入造成的,因为运行stuff.py因为独立脚本不会引发ConfigParser.NoSectionError.

其他读取配置文件一次然后在其他模块中使用数据的方法也将非常有用。


这个问题有两个方面。First是奇怪的行为ConfigParser. When ConfigParser无法找到.ini文件;由于某些烦人的原因,它永远不会给出IOError或指示无法读取文件的错误。

就我而言,它不断给予ConfigParser.NoSectionError当。。。的时候section明显存在。当我抓住了ConfigParser.NoSectionError它给出了错误ImportError!但它永远不会告诉您它根本无法读取该文件。

Second是如何安全地阅读包中包含的数据文件。我发现做到这一点的唯一方法是使用__file__范围。这就是您安全阅读的方式config.ini在上面的问题中,对于Python27和Python3:

import os

try:
    # >3.2
    from configparser import ConfigParser
except ImportError:
    # python27
    # Refer to the older SafeConfigParser as ConfigParser
    from ConfigParser import SafeConfigParser as ConfigParser

config = ConfigParser()

# get the path to config.ini
config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config.ini')

# check if the path is to a valid file
if not os.path.isfile(config_path):
    raise BadConfigError # not a standard python exception

config.read(config_path)

TEST_KEY = config.get('main', 'test_key') # value

这取决于以下事实:config.ini位于我们的包裹内bootstrap并预计将随之发货。

重要的是你如何获得config_path:

config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config.ini')

__file__指的是当前的位置script正在执行。在我的问题中,这意味着stuff.py,即在里面bootstrap文件夹,也是如此config.ini.

上面这行代码的意思是:获取绝对路径stuff.py;从该获取路径到包含它的目录;并加入config.ini(因为它位于同一目录中)给出绝对路径config.ini。然后您可以继续阅读并提出exception万一。

即使您在以下位置发布软件包,这也将起作用pip用户从那里安装它。

As a bonus,并且稍微偏离这个问题,如果您要在pip数据文件在你的包里,你必须告诉setuptools在构建时将它们包含在您的包中sdist and bdists。所以要包括config.ini在上面的包中添加以下行setup班级呼入setup.py:

include_package_data = True,
package_data = {
    # If any package contains *.ini files, include them
    '': ['*.ini'],
},

但在某些情况下它仍然可能不起作用,例如。造轮子等。所以你也在你的MANIFEST.IN file:

include LICENSE
include bootstrap/*.ini
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 python 包中添加和读取 config.ini 文件 的相关文章

随机推荐

  • 使用 smoothScatter 生成的颜色密度散点图的 R 图例

    我正在 R 中使用以下命令生成颜色密度散点图smoothScatter 功能 Example A largish data set n lt 10000 x1 lt matrix rnorm n ncol 2 x2 lt matrix rn
  • 如何覆盖 Google 地图中的 KML 颜色?

    我正在通过 Google 地图的 V3 API 加载 KML 文件 正在使用 KML 文件中的颜色 但我想用我自己的颜色覆盖它 我实际上想对整个轨迹使用纯色 有没有办法做到这一点 KML colors are based on Stylea
  • HTTPS 查询字符串安全吗?

    我正在创建一个使用 HTTPS 的基于安全 Web 的 API 但是 如果我允许用 户使用查询字符串配置它 包括发送密码 这也是安全的还是我应该强制它通过 POST 完成 是的 但对敏感数据使用 GET 并不是一个好主意有几个原因 主要是
  • 在文件中调用 powershell 函数,无需点源

    如果我的文件中只有一个与该文件同名的函数 这可能吗 我好像记得以前读过 像这样的东西 你好 ps1 function hello Write Host Hello world 我会完全摆脱函数调用 您根本不会丢失命名参数和 cmdlet 包
  • 如何侦听所有组件上的按键(在 Java Swing 内)?

    I would like to listen for key combinations such as Control S without adding key listeners to each component in my Swing
  • 在 wxPython 的窗口中显示 .png 图像

    如何显示一个 pngwxPython 窗口中的图像 png wx Image imageFile wx BITMAP TYPE ANY ConvertToBitmap wx StaticBitmap self 1 png 10 5 png
  • Mongoose:将JS对象直接插入数据库

    好的 我有一个 JS 对象 它通过 AJAX POST 到 Nodejs 后端 我想将此 js 对象直接插入到我的猫鼬数据库中 因为对象键已经与数据库模式完美匹配 我目前有这个 不是动态的并且过于复杂 app post items subm
  • 如何使用库

    由于某种原因 我永远无法使用任何语言的外部库 我正在寻找有关如何使用外部库及其工作原理的说明 解释 当我在线搜索时 我得到的片段似乎永远不适用于我下载并尝试使用的任何库 我在 Mac 和 PC 上工作 C 示例都很好 我使用带有 C 插件的
  • 如何使用 kendo 验证器验证日期的格式为 yyyy-MM-dd?

    我有一个剑道日期选择器 其构造如下 date kendoDatePicker format yyyy MM dd footer parseFormats MM dd yyyy dd MM yyyy 我想使用 kendo 验证器来验证日期是否
  • 使用 Python 实现 collat​​z 函数

    我目前在 自动化无聊的事情 中无法完成此挑战 我的代码是 def collatz number global seqNum if seqNum 2 0 return seqNum 2 elif seqNum 2 1 return 3 seq
  • 如何使用Tomcat 8 + Spring Boot + Maven

    根据参考 API使用 Tomcat 8和这个部署 Spring Boot 应用程序教程应该可以使用 Tomcat 8春季启动 默认使用 Tomcat 7 由于某种原因 它对我不起作用 我究竟做错了什么 pom xml
  • Java 6 中 java.nio.file.Files 的替代方案

    我有下面一段使用 java 7 功能的代码 例如java nio file Files 和 java nio file Paths import java io File import java io IOException import
  • 离子/角度传单指令 - 放大/缩小按钮不起作用

    我对传单地图上的默认放大 缩小按钮有一些问题 当我直接加载页面时 一切正常 但是当我将一种状态更改为声明传单指令所在位置时 按钮就不起作用 给你例子 http codepen io anon pen JkyEg editors 101 代码
  • 从指定列中减去 pandas 列

    如何从指定列中动态减去多个 pandas 数据帧列中的值 在这种情况下 如何从存款中减去 A B C 列 并将该值放入相应的 A B C 列中 date deposit A B C 0 2017 01 15 12 5 10 12 1 201
  • PHP 将每个项目的 foreach 输出显示到屏幕上

    我在 php 中注意到的一件事是 在脚本停止工作之前 屏幕上不会输出任何内容 对于我正在从事的项目 我输入了超过 100 个项目的列表 它对每个项目执行 HTTP 请求 完成后 显示一个页面 其中包含每个项目的状态 成功 失败等 我想知道是
  • lastModified() 函数返回当前日期和时间

    我的问题是 为什么当我在网页上使用 document lastModified 时 它会返回当前日期和时间 而不是该页面上次修改的时间 有任何想法吗 提前致谢 实际代码是 因为你现在正在修改它 检查一下这个example 为了根据您的要求进
  • 如何在云端成功托管用 Python 编写的 Telegram 机器人(免费)?

    我跟着本教程使用 Python 创建 Telegram 机器人 最后 我在我的机器上本地运行它ngrok 为了测试这个机器人 我在 Telegram 中向它发送了消息 有效 所以这是一个很好的教程 但是 现在我想在云端托管机器人 因为我当然
  • Rails/Javascript:如何将 Rails 变量注入(非常)简单的 javascript

    我想在rails中编写一个非常简单的javascript计算器 它将输入字段的数量乘以rails变量中存储的数字 item base price 所以 在 javascript coffeescript 方面 粗略地说是这样的 app as
  • 如何从 C 程序中获得 100% CPU 使用率

    这是一个非常有趣的问题 所以让我来介绍一下场景 我在国家计算博物馆工作 我们刚刚设法让一台 1992 年的 Cray Y MP EL 超级计算机运行起来 我们真的很想看看它能跑多快 我们认为最好的方法是编写一个简单的 C 程序来计算素数并显
  • 在 python 包中添加和读取 config.ini 文件

    我正在编写我的第一个 python 包 我想将其上传到 PyPI 上 我基于此构建了我的代码博客文章 我想将用户设置存储在 config ini 文件中 在同一包中的单独 python 模块中读取一次 每次运行包时 并将用户设置保存在该模块