【问题标题】:Read Value from Config File Python从配置文件 Python 中读取值
【发布时间】:2017-07-22 22:13:56
【问题描述】:

我有一个文件 .env 文件包含 5 行

DB_HOST=http://localhost/
DB_DATABASE=bheng-local
DB_USERNAME=root
DB_PASSWORD=1234567890
UNIX_SOCKET=/tmp/mysql.sock

我想写python来获取DB_DATABASE的值 我想要这个bheng-local


我会用

import linecache
print linecache.getline('.env', 2)

但是有些人可能会改变配置的顺序,这就是为什么我不能选择 linecache。


我不知道如何只检查一些字符串匹配但整个行,并获取= 之后的值。

我有点卡在这里:

file = open('.env', "r")
read = file.read()
my_line = ""

for line in read.splitlines():
    if line == "DB_DATABASE=":
        my_line = line
        break
print my_line

有人可以在这里给我一点推动吗?

【问题讨论】:

  • startwith 可能会有所帮助。

标签: python configuration environment-variables


【解决方案1】:

看看配置解析器: https://docs.python.org/3/library/configparser.html

比自制解决方案更优雅

【讨论】:

  • 我喜欢使用解析器的想法,但它需要我在配置文件的顶部添加更多文本。我不介意我是否是唯一拥有它的人。该配置文件 s 已经部署到数千人。 :( 有没有一种简单的方法可以根据文件字符串 DB_DATABASE 来获取它?
  • 有一些黑客可以绕过它,你可以找到它们here:最短的可能是this one,对于Python 3.2+和this one对于早期版本。最优雅的可能是this one
【解决方案2】:

将您的 .env 修改为

[DB]
DB_HOST=http://localhost/
DB_DATABASE=bheng-local
DB_USERNAME=root
DB_PASSWORD=1234567890
UNIX_SOCKET=/tmp/mysql.sock

Python 代码

#!/usr/local/bin/python
import configparser
config = configparser.ConfigParser()
config.read('test.env')
print config.get('DB','DB_DATABASE')

输出:

bheng-本地

阅读https://docs.python.org/3/library/configparser.html

【讨论】:

  • 我喜欢使用解析器的想法,但它需要我在配置文件的顶部添加更多文本。我不介意我是否是唯一拥有它的人。该配置文件 s 已经部署到数千人。 :( 有没有一种简单的方法可以根据文件字符串 DB_DATABASE 来获取它?
【解决方案3】:

这应该适合你

#!/usr/local/bin/python
file = open('test.env', "r")
read = file.read()

for line in read.splitlines():
    if 'DB_DATABASE=' in line:
        print line.split('=',1)[1]

【讨论】:

    【解决方案4】:
    #!/usr/local/bin/python
    
    from configobj import ConfigObj
    conf = ConfigObj('test.env')
    print conf['DB_DATABASE']
    

    【讨论】:

    • 使用 ConfigObj,我们不需要在 .env 文件的开头添加任何像节头这样的东西来从中读取变量值。
    • 而且没有header,配置文件也可以被其他语言轻松读取,比如Bash。
    【解决方案5】:
    from os import environ, path
    from dotenv import load_dotenv
    
    basedir = path.abspath(path.dirname(__file__))
    load_dotenv(path.join(basedir, '.env'))
    DB_DATABASE = environ.get('DB_DATABASE')
    print(DB_DATABASE)
    

    这可能是另一种选择

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多