2012-05-10 5 views
0

У меня такое чувство, что я глуп. Учитывая этот INI-файл:python configparser висит тихо

[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 config.has_option('main', 'source1') and \ 
        config.has_option('main', 'sync1') and \ 
        config.has_option('main', 'archive1') : 

он не вешает. (Не делать то, что я хочу, так как мне нужно перебрать произвольное число наборов из трех, но не молча повесить.

Python v2.7.3 на Ubuntu 12.04 (Precise), 32bit.

ответ

1

Причина, по которой ваша программа зависает, никогда не вырывается из цикла - она ​​продолжается вечно. Вместо того, чтобы просто устанавливать result, вам нужно указать return. (Альтернативный вариант - установить его, а затем использовать break для выхода из цикла и Возвращайтесь, но это немного круговое движение. Лучше просто вернуть его сразу.

Обратите внимание, что выполнение while True: и подсчет, как это не очень Pythonic, t он предпочитает использовать вместо этого itertools.count().

например:

import itertools 

... 

for index in itertools.count(1): 
    ... 

Обратите внимание, что это показывает недостаток дизайна. Вероятно, вы захотите узнать, не достигнете ли вы подходящего результата. Бесконечные петли, как правило, плохие.

+0

ok. Спасибо, что указал глупо. Я обвиняю 2 часа сна с прошлой ночи. – Jason

+0

Я оставил «else: break» из внутреннего оператора if. – Jason

Смежные вопросы