我有一种感觉我是愚蠢的。鉴于此ini文件:
[main]
source1 = ./testing/sdir1
sync1 = ./testing/sydir1
archive1 = ./testing/adir1
source2 = ./testing/sdir2
sync2 = ./testing/sydir2
archive2 = ./testing/adir2
[logging]
log_dir = .
log_file = pixelsync.log
log_level = DEBUG
以下代码挂起:
import ConfigParser
CONFIG_FILE = 'pixelsync.ini'
def parse_config() :
"""read details from the config file"""
global CONFIG_FILE
config = ConfigParser.SafeConfigParser()
config.read(CONFIG_FILE)
index = 1
while True :
if config.has_option('main', 'source' + str(index)) and \
config.has_option('main', 'sync' + str(index)) and \
config.has_option('main', 'archive' + str(index)) :
result = ( config.get('main', 'source' + str(index)),
config.get('main', 'sync' + str(index)),
config.get('main', 'archive' + str(index)))
index += 1
else :
if index == 1 :
print "could not setup any trios from the config file. exiting."
sys.exit(1)
return result
if __name__ == '__main__' :
options = parse_config()
它依赖于'如果'子句。
如果我更换了' if'条款:
if config.has_option('main', 'source1' ) and \
config.has_option('main', 'sync1' ) and \
config.has_option('main', 'archive1' ) :
它不会挂起。 (我没有做我想做的事情,因为我需要循环遍历任意数量的三组,但它并没有默默地挂起。
ubuntu 12.04(精确)上的Python v2.7.3,32位。
答案 0 :(得分:1)
程序挂起的原因是它永远不会脱离循环 - 它会永远持续下去。您需要result
,而不是简单地设置return
。 (另一种方法是设置它,然后使用break
突破循环并返回,但这有点迂回。最好简单地直接返回它。
请注意,执行while True:
并且计数不是非常Pythonic,首选方法是使用itertools.count()
。
E.g:
import itertools
...
for index in itertools.count(1):
...
请注意,这表明存在设计缺陷。你可能想知道你是否永远不会得到合适的结果。无限循环通常很糟糕。