【问题标题】:Python library with config file带有配置文件的 Python 库
【发布时间】:2017-04-28 17:45:23
【问题描述】:

我想在某种容器中收集我在项目中创建的许多库,以便我可以在我未来的项目中轻松使用它们中的任何一个。我很清楚如何做到这一点,除了一部分。

我假设每个服务都有自己的配置文件(例如,Cache 服务,将有一个带有缓存主机和端口的配置文件,等等)。现在的问题是:当我想在任意项目中使用这个容器时,我必须对项目目录结构做出假设,才能知道在哪里可以找到这些配置文件。

例如,有人可能会假设在我的库的同一路径上有一个config 文件夹,我将在其中找到我的服务的配置文件。但是,这可能与项目的目录结构冲突(例如,项目可能已经有自己的 config 目录)。

所以,总而言之,我的问题是:是否有一种安全、标准的方式来发布一个库,它可能假设在某个地方找到一些配置文件,或者对于哪些示例配置文件与库本身一起发布?

【问题讨论】:

  • 这里的“容器”是什么意思?
  • s/by "container" here// 我的意思是说真的,我没有从你的问题中理解任何事情。
  • 我的意思通常是一个可以注册服务并通过它可以实例化服务的单例(例如,我有一个Cache 服务,一个CommunicationChannel 服务等等)。如果这还不够清楚,请告诉我应该更具体的内容。
  • @zmo 我明白了,如果你能指出我的解释中遗漏了什么,我很乐意让自己更清楚。
  • 通常情况下,您将拥有库或模块或任何能够从外部接收配置的东西,因此它不会与文件系统布局或真正的文件耦合。

标签: python containers config


【解决方案1】:

好吧,你不应该保留配置文件,或者任何你想要修改的东西以及 python 中的代码(或者实际上是任何语言)。每个操作系统都有用于此目的的文件夹。

它可以是系统范围的,在 Unix 上它是 /etc 或者它是在 ~/.config 中的用户。你有用于 OSX 的Library 文件夹,我相信除了\Windows\SYSTEM32 ?之外,Windows 也有类似的东西。

这意味着您的配置文件的路径在任何时候都不应被视为相对于您的代码。绝不。永远。

你可以在 python 包中包含一些 assets,使用 MANIFEST.in 但是,因为它会在你的 python 包中,你应该假设你没有权利在哪里写'将(由管理员安装,由用户运行)。

您还可以使用setup.pydata_files 指令指定其中一些资产安装在特定位置,该指令将相对于sys.prefix 安装。

通常的做法是使用文档中的链接提供配置文件示例,或者在启动应用程序时更好地生成这些文件。

另外,台式机的另一个趋势是使用XDG directory specification 来决定在哪里查找或放置配置文件。

总结一下:

  • 列出您的代码期望找到配置的默认路径,
  • 可以在命令行中手动指定配置python foo.py --config bar.ini的路径
  • 为您的工具编写一个功能来生成配置(带有一系列问题)
  • 将默认配置部署到标准位置(XDG 路径、$prefix/etc...)

【讨论】:

  • Windows 有 %APPDATA%%LOCALAPPDATA% 分别解析为 "C:\users\<username>\AppData\Roaming\""C:\users\<username>\AppData\Local\"。后者应该用于本地安装,而前者在域用户可能使用的其他机器之间共享。
  • 嗯……很有趣……我很想知道为什么我只是因为说出了被认为是常见的良好做法而得到了?。
  • 我也是。我看不出这个答案有什么特别不好的地方,除了它可能在回答一个无法回答的问题。该问题应作为题外话结束,但答案会尽最大努力在尽可能多的范围内解决该问题。
  • ¯\_(ツ)_/¯ 好吧……
  • 我同意,我认为你不应该投反对票(投赞成票来弥补)。除此之外,您确实列出了执行此操作的一般方法,但我期待更多类似于“最佳实践”的东西来发布库及其配置文件。例如,像 Laravel 和 Django 库有配置文件并希望在特定路径中找到它们。当然,也许在这些情况下,我们更多地谈论的是“框架”而不是“库”。但也许我只是感到困惑。
猜你喜欢
  • 2017-04-17
  • 1970-01-01
  • 2010-09-16
  • 2019-06-26
  • 2023-03-30
  • 2022-01-14
  • 2018-01-23
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多