我试图了解实现Python的ConfigParser的最佳方法,以便多个程序模块都可以访问元素。我正在使用:-
import ConfigParser
import os.path
config = ConfigParser.RawConfigParser()
config.add_section('paths')
homedir = os.path.expanduser('~')
config.set('paths', 'user', os.path.join(homedir, 'users'))
[snip]
config.read(configfile)
Run Code Online (Sandbox Code Playgroud)
在最后一行引用了configfile变量。这必须传递到Config模块,以便用户可以覆盖默认配置文件。我应该如何以其他模块可以使用config.get(spam,eggs)的方式在模块/类中实现此功能?
我正在寻找一种解决方案,允许我使用配置文件数据的属性。
我希望能够做这样的事情:
config = Config('config.ini')
print config.section1.user
print config.section2.password
Run Code Online (Sandbox Code Playgroud)
我确实知道 ConfigParser 允许我做类似的事情,config['section1']['user']但这太丑陋了,我们不能做得更好吗?
该解决方案必须适用于 Python 2.5 或更高版本。
我想使用python ConfigParser模块读取配置文件:
[asection]
option_a = first_value
option_a = second_value
Run Code Online (Sandbox Code Playgroud)
我希望能够获得为选项“ option_a”指定的值的列表。我尝试了以下显而易见的方法:
test = """[asection]
option_a = first_value
option_a = second_value
"""
import ConfigParser, StringIO
f = StringIO.StringIO(test)
parser = ConfigParser.ConfigParser()
parser.readfp(f)
print parser.items()
Run Code Online (Sandbox Code Playgroud)
哪个输出:
[('option_a', 'second_value')]
Run Code Online (Sandbox Code Playgroud)
当我希望:
[('option_a', 'first_value'), ('option_a', 'second_value')]
Run Code Online (Sandbox Code Playgroud)
或者,甚至更好:
[('option_a', ['first_value', 'second_value'])]
Run Code Online (Sandbox Code Playgroud)
有没有办法用ConfigParser做到这一点?另一个主意?
配置文件通常需要每个部分的节头.在rsyncd配置文件中,全局部分不需要显式地具有节头.rsyncd.conf文件的示例:
[rsyncd.conf]
# GLOBAL OPTIONS
path = /data/ftp
pid file = /var/run/rsyncdpid.pid
syslog facility = local3
uid = rsync
gid = rsync
read only = true
use chroot = true
# MODULE OPTIONS
[mod1]
...
Run Code Online (Sandbox Code Playgroud)
如何使用python解析这样的配置文件ConfigParser?执行以下操作会产生一个错误:
>>> import ConfigParser
>>> cp = ConfigParser.ConfigParser()
>>> cp.read("rsyncd.conf")
# Error: ConfigParser.MissingSectionHeaderError: File contains no section headers.
Run Code Online (Sandbox Code Playgroud) 所以我想首先说我一直在寻找SO的答案,并且找不到任何有用的东西.我也查看了Python的文档,但未能找到有用的东西.我的上一个问题有点懒,收到负面反馈,所以我尽我所能在这里提出一个简单明了的问题.一如既往,提前感谢您的帮助!
那么,有人可以解释我在Python的ConfigParser中遇到的奇怪行为.我有两个不同的配置文件,每个都有一个Section 1.这两个文件具有不同数量的选项,但覆盖的选项数量较少.这是代码和输出:
第一个配置文件:test1.ini
[Section 1]
Option 1 : One
Option 2 : Two
Option 3 : None
Option 4 : Four
Run Code Online (Sandbox Code Playgroud)
第二个配置文件:test2.ini
[Section 1]
Option 1 : One
Option 2 : None
Option 3 : Three
Run Code Online (Sandbox Code Playgroud)
读取配置文件的驱动程序
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
def ParseThis(file, section):
parser.read(file)
for option in parser.options(section):
print "\t" + option
try:
if parser.get(section, option) != 'None':
print option + ": " + parser.get(section, option)
else:
print option + ": Option doesn't …Run Code Online (Sandbox Code Playgroud) 我正在使用RawConfigParser来读取和更新 ini 样式的配置文件。这在标准配置中完全没有问题。我的问题是我在同一个脚本中读取不同的配置文件。无需过多赘述,当我阅读第二个配置文件时,它的值与第一个 ini 文件合并。
两个 ini 文件的原始内容
infile_1.ini
[section]
option = Original value
extraoption = not in ini file 2
inifile_2.ini
[section]
option = Original value
Run Code Online (Sandbox Code Playgroud)
这是我用来更改 ini 文件内容的代码。这是重现问题的一小段代码
import ConfigParser
class status_file:
myConfig = ConfigParser.RawConfigParser()
myConfig.optionxform = str
def __init__(self, str_statusfile):
self.myConfig.read( str_statusfile)
self.statusfile = str_statusfile
def option(self, new_value):
self.myConfig.set("section","option",new_value)
with open( self.statusfile, "w") as ini_out:
self.myConfig.write( ini_out )
statusfiles = ['inifile_1.ini', 'inifile_2.ini']
for myStatus in statusfiles:
myConfig = status_file(myStatus)
myConfig.option("Something new")
Run Code Online (Sandbox Code Playgroud)
执行此代码后,ini 文件的内容已按预期更改。但是在第二个 ini 文件中,合并了第一个 …
我有一个简单的python3脚本,当我从控制台运行它时,它可以工作:
import configparser
file = 'config_test.ini'
config = configparser.ConfigParser()
config.read(file)
for key in config['test_section']: print(key)
Run Code Online (Sandbox Code Playgroud)
被调用的ini文件看起来像这样:
[test_section]
testkey1 = 5
testkey2 = 42878180
testkey3 = WR50MS10:1100012307
testkey4 = WR50MS04:1100012010
testkex5 = 192.168.200.168
Run Code Online (Sandbox Code Playgroud)
并且脚本运行正常并返回ini文件的五个键.
不,我每分钟都将它配置为cronjob(在Raspberry Pi上运行rasbian)通过:
* * * * * python3 /home/pi/s0/testconfig.py >> /tmp/cron_debug_log.log 2>&1
Run Code Online (Sandbox Code Playgroud)
并且日志看起来像这样:
Traceback (most recent call last):
File "/home/pi/s0/testconfig.py", line 7, in <module>
for key in config['test_section']: print(key)
File "/usr/lib/python3.2/configparser.py", line 941, in __getitem__
raise KeyError(key)
KeyError: 'test_section'
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了亲切的问候
我有一个配置文件,其中定义了一些选项。有时,如果找不到请求的选项,我想忽略错误并返回None。
setting.cfg:
[Set]
ip=some_ip
verify=yes #if verify does not exist here --> verify=None
Run Code Online (Sandbox Code Playgroud)
test.py:
import sys
import ConfigParser
file="setting.cfg"
class ReadFile:
def read_cfg_file(self):
configParser = ConfigParser.RawConfigParser(allow_no_value=True)
if os.path.isfile(file):
configParser.read(file)
else:
sys.exit(1)
try:
verify = configParser.get('Set', 'verify')
except ConfigParser.NoOptionError:
pass
return verify,and,lots,of,other,values
Run Code Online (Sandbox Code Playgroud)
如果我这样处理它,我将无法返回值,因为如果'verify'找不到该选项,它就会简单地传递。
如果找不到选项,有什么方法可以忽略错误,而是返回None?
例如,这样的事情:
verify = configParser.get('Set', 'verify')
if not verify:
verify=False
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用配置文件、python 和 ConfigParser 构建动态操作。我对 Python 还很陌生(两周前),所以我不确定这是否可能,这就是我想问的原因。
这是一个示例配置文件:
[General]
Volume File = C:\Users\O\Desktop\Sanjeev\Python\Solution\volume.xlsx
New Variables File = C:\Users\O\Desktop\Sanjeev\Python\Solution\newvar.xlsx
Desired Variable Name = Price,Age
Merging Variables = Category,State
[Operations]
Operation1 = Price*Volume,Revenue
Operation2 = Revenue/Age,Annual Revenue
Run Code Online (Sandbox Code Playgroud)
因此,在这里我将使用合并变量来合并第一个和第二个数据集,保留并可能聚合所需的变量。然后,根据操作部分中指定的操作,我将执行它们并将它们存储在与列表中第二项同名的变量中。
我想在配置文件而不是 python 脚本中指定这些操作的原因是因为这些操作的数量和类型会有所不同。我需要创建动态代码,该代码能够解析配置文件中的此选项,就好像它是代码一样并执行它。
我想要一些关于如何开始的指导。
我一直在慢慢地从 py2 -> py3 过渡,但我遇到了一个我无法完全解决的问题(尽管我确定问题是微不足道的)。当我执行下面的代码时,配置文件似乎没有任何部分:(
我哪里误会了?
请注意,我确实从 python 2 脚本中重用了这段代码(用新的 configparser.ConfigParser 替换了旧的 ConfigParser.SafeConfigParser)。我不认为这个事实是相关的,但也许是?显然,我不知道:)
这是项目/main.py
import inspect
import os
import utilities.utilities
def main():
config_ini_path = os.path.abspath(inspect.getfile(inspect.currentframe()).split('.py')[0] + '_config.ini'
print(config_ini_path)
config = utilities.utilies.get_config(config_ini_path)
print(config.sections())
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
这是项目/实用程序/实用程序.py:
import os
import configparser
import inspect
import sys
def get_config(config_file_path=os.path.abspath(inspect.getfile(inspect.currentframe()).split('.py')[0]) + '_config.ini'):
parser = configparser.ConfigParser()
if os.path.exists(config_file_path):
with open(config_file_path, 'r') as config_file:
parser.read(config_file)
return parser
else:
print('FAILED TO GET CONFIG')
sys.exit()
def set_config(parser, config_file_path):
if os.path.exists(config_file_path):
with open(config_file_path, 'w') as config_file:
parser.write(config_file) …Run Code Online (Sandbox Code Playgroud) configparser ×10
python ×9
python-3.x ×2
class ×1
config ×1
cron ×1
exception ×1
ini ×1
python-2.7 ×1
rsync ×1