Python文件的配置文件(.py)

4

有人告诉我这样做是一个不太好的习惯(尽管在Python模式:共享应用程序配置的主要答案中出现):

configfile.py

SOUNDENABLED = 1
FILEPATH = 'D:\\TEMP\\hello.txt'

main.py

import configfile

if configfile.SOUNDENABLED == 1:
    ....

f = open(configfile.FILEPATH, 'a')
...

这得益于许多人使用ConfigParser模块或iniparse或其他类似模块的INI文件进行本地配置。
问题:为什么使用INI文件进行本地配置 + INI解析器Python模块比仅导入包含正确配置值的configfile.py文件作为常量更好?

尝试将 configfile.py 中的扩展名 .py 更改为其他内容 - 您的代码将无法正常工作。 - Anton K
4个回答

5
这里唯一的问题是 .py 可以包含任意 Python 代码,因此可能会以任意方式破坏您的程序。
如果您相信用户会负责地使用它,那么这种设置没有任何问题。事实上,在我之前的一份工作中,我们就是这样做的,没有我知道的任何问题。 相反,它允许用户通过自动生成重复部分和导入其他配置文件来消除重复。
另一个问题是,如果您有很多文件,最好将配置文件与常规代码文件分开,这样用户就知道他们应该能够编辑哪些文件(上面的链接也解决了这个问题)。

3

导入一个模块会执行其中包含的任何代码。没有任何限制你的configfile.py只包含定义。长远来看,这会导致安全问题和难以理解的错误。此外,你必须遵循Python的模块搜索路径来查找配置文件。如果你想将配置文件放在其他地方,或者出现名称冲突怎么办?


谢谢。我记不清了,难道没有办法从特定位置导入模块,比如/boot/config.py吗?(例如在树莓派上) - Basj
是的,比如说可以使用importlib,但这并不像import <module>或者open(<file path>)一样简单明了。 - alexis

2
这是一种完全可接受的做法。使用这种方法的一些知名项目例如Djangogunicorn

谢谢。你能添加一些相关的Github文件链接以供将来参考吗?这样我们就可以看到这是一个可接受的做法了。 - Basj
我已经链接到文档,两个文档都明确说明设置是一个普通的Python文件。 - Daniel Roseman
1
谢谢。他们是如何做到以下两点的:1)从另一个目录导入相关的.config.py文件?2)确保在部署新版本的Django时文件不被删除? - Basj
我不明白你的意思。设置应该放在你自己的项目中,而不是第三方库中;它们允许你定义你想要配置应用程序的方式。 - Daniel Roseman
顺便提一下,Django 用户不直接导入设置文件。相反,他们导入 django.conf.settings,该模块会导入用户的设置文件,并在其周围构建代理对象,允许定义默认值,而无需在设置文件中定义这些默认值,或者由用户的设置文件另行导入。https://github.com/django/django/blob/master/django/conf/__init__.py - Trevor Ian Peacock

1

出于某些原因,它可能会更好

  1. 配置文件的唯一扩展名是py
  2. 除非在此目录中放置一个__init__.py,否则无法使用单独的目录分发程序的配置。
  3. 您程序的不良用户可以将任何Python脚本放入配置中并做出不良行为。

例如,YouCompleteMe自动完成引擎将配置存储在Python模块.ycm_extra_conf.py中。默认情况下,每次导入配置时,它都会询问您是否确定执行该文件是安全的。

  1. 如何在不重启应用程序的情况下更改配置?

通常,允许执行来自外部的代码是一种漏洞,可能会导致非常严重的后果。

但是,如果您不关心这些问题,例如,您正在开发仅在服务器上执行的Web应用程序,则将配置放入Python模块是可接受的做法。 Django就是这样做的。


谢谢。我不太同意第三点:Python是解释性语言,这意味着您可以访问所有源文件。那么,如果一个恶意用户想要放置恶意代码,他不需要将其放在“configfile.py”中,他可以在“main.py”中进行,您认为呢? - Basj
@Basj 如果配置文件从其他地方加载,例如你不太信任的远程文件系统,该怎么办? - Anton K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接