Уведомления

Группа в Telegram: @pythonsu

#1 Май 7, 2012 12:40:09

daimonkor
Зарегистрирован: 2012-05-07
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение print

def ini_file(mode, section, file_name , key, option = 'None'):          
    try:
        config = configparser.ConfigParser()
        exit_str = (separator_arguments + separator_string).join(["Ini: %s" %(file_name), "mode: %s" %(mode),"section: %s"%section, "key: %s" %(key), "option: %s"%(option)])  
        if mode == 'r':
            config.readfp(open(file_name, "r"))
            config.get(section,key)
                          
            exit_str += separator_string.join([separator_arguments, 'exit', 'code: %s'% str(enum_code_ini.ECI_EXIST_FILE_IN_LIST_MD5)])
            print(exit_str)
            
            return enum_code_ini.ECI_EXIST_FILE_IN_LIST_MD5
         
        elif mode == 'w':
           if(os.path.exists(file_name)):  
               config.readfp(open(file_name, "r"))
           else:
               config.add_section(section_files_ini_file)
               config.add_section(section_folders_ini_file)
                
           config.set(section, key, option)
          
           config.write(open(file_name, "w"))
           
           exit_str += separator_string.join([separator_arguments, 'exit', 'code: %s'% str(enum_code_ini.NONE)])
           print(exit_str)
       
           return enum_code_ini.NONE
         
    except configparser.Error as err:
        exit_str+= separator_string.join([separator_arguments, 'exit', 'code: %s'% str(enum_code_ini.ERROR)])
       
        print(os.path.basename(__file__),"%s:"%type(err).__name__,err, exit_str, file=sys.stderr,sep =separator_string)
        return enum_code_ini.ERROR   
    except OSError as err:
        
        exit_str+= separator_string.join([separator_arguments, 'exit', 'code: %s'% str(enum_code_ini.ECI_NOT_INI_FILE)])
        print("NOT")
        print(os.path.basename(__file__),"%s:"%type(err).__name__,err, exit_str, file=sys.stderr,sep =separator_string)
        return enum_code_ini.ECI_NOT_INI_FILE   
    except IOError as err:
        
        exit_str+= separator_string.join([separator_arguments, 'exit', 'code: %s'% str(enum_code_ini.ECI_NOT_INI_FILE)])
        print(os.path.basename(__file__),"%s:"%type(err).__name__,err, exit_str, file=sys.stderr,sep =separator_string)
        return enum_code_ini.ECI_NOT_INI_FILE  
вызываю так:
    saveout = sys.stdout
    saveerr = sys.stderr
            
    if options.stream_log_out_file_name:           
      stream_log_out_file = open( options.stream_log_out_file_name, 'w')
      sys.stdout = stream_log_out_file
      sys.stderr = stream_log_out_file            
    if options.stream_log_err_file_name:
      stream_log_err_file = open( options.stream_log_err_file_name, 'w')
      sys.stderr = stream_log_err_file 
    
    global old_ini_dict
    old_ini_dict = IniFile.ini_file_dict('r', os.path.join(temp_folder_name,old_info_ini_name))
    
    print(old_info_ini_name,"%s:"% old_ini_dict.__class__.__name__, old_ini_dict, sep =separator_string)
    print(separator_primary_block)
    print('Parsing', resources_xml_file_name,"...",sep = separator_string)  
    print(separator_primary_block)
    sys.stdout = saveout  #создал для того, чтобы восстановить поток, так как он перенаправлен на файл
    sys.stderr = saveerr #

вот лог выполнения:
####################################################################################################
old_info.ini int: 6
####################################################################################################
Parsing resources1.xml ...
####################################################################################################
IniFile.py IOError: [Errno 2] No such file or directory: 'temp_resources1\\old_info.ini' Ini: temp_resources1\old_info.ini, mode: r, dict: None, exit code: 6
Так вот почему print exception запаздывает с выводом текста?

Отредактировано daimonkor (Май 7, 2012 13:29:15)

Офлайн

#2 Май 7, 2012 13:29:37

Duck-Pagan
Зарегистрирован: 2012-05-02
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение print

Print сама по себе работает в python не быстро.
Функция исключения ошибок - не панацея, если возможно написать программу без этой функции лучше всего так и сделать.
Потом, машина у вас просчитывает различные варианты ошибок (OSError, IOError) - структурно они у вас одинаковые - тогда зачем заставлять думать машину для вывода одного и того же сообщения об ошибки для разных ее вариантов - используйте except без имени. Отловит любую ошибку.

Офлайн

#3 Май 7, 2012 13:32:04

daimonkor
Зарегистрирован: 2012-05-07
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение print

на счёт exception согласен, но убираю восстановление потока и всё выводится нормально (стоит ли вообще это делать?)

Офлайн

#4 Май 7, 2012 13:34:31

daimonkor
Зарегистрирован: 2012-05-07
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение print

Duck-Pagan
если создать один exception, как в нём отловить строку ошибки или класс, где прошла ошибка?
Ошибка -нет файла или проблема парсера ini файлов

Отредактировано daimonkor (Май 7, 2012 13:38:17)

Офлайн

#5 Май 7, 2012 13:54:30

Duck-Pagan
Зарегистрирован: 2012-05-02
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение print

Присутствие файла можно проверить и без исключение ошибки(и вообще отсюда и плясать), иначе что-то с парсером, соответственно.
Есть вариант который я сам не проверял, но возможно что можно как-то извратиться делая возврат типа ошибки. Соответственно на выходе будем получать что-то со значением Истина, а что-то с Ложь - но это мутно, и просто мысль.
Почитай про assert - в некоторых моментах вещь крайне полезная. Возможно поможет.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version