Портирование Python2 на Python3: исключения ConfigParser - AttributeError для MissingSectionHeaderError - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь перенести скрипт Python2.7 на Python3.6 + и наткнулся на контрольно-пропускной пункт, который мой поиск в Google не смог разрешить. Проблема заключается в том, что попытка try: exception: call ниже не работает после выполнения некоторых первоначальных предложений по переносу. Я уверен, что это что-то простое;просто ускользает от меня в данный момент.

Python2.7 код: (работает)

import ConfigParser
logOutCfg = ConfigParser.ConfigParser()

try:
 if (os.path.isfile(logOutfilename)) : logOutCfg.read(logOutfilename)
except ConfigParser.MissingSectionHeaderError as e:
 pass
except ConfigParser.ParsingError as e:
 print(str(e))
 pass

Python3.6 попытка кода (не 't работает под Python 2.7):

from configparser import ConfigParser
logOutCfg = ConfigParser()

try:
 if (os.path.isfile(logOutfilename)) : logOutCfg.read(logOutfilename)
except ConfigParser.MissingSectionHeaderError as e:
 pass
except ConfigParser.ParsingError as e:
 print(str(e))
 pass

Ошибка, сообщаемая сценарием при работе под Python2:

 File "<script>.py", line 242, in <function>
    except ConfigParser.MissingSectionHeaderError:
AttributeError: type object 'ConfigParser' has no attribute 'MissingSectionHeaderError'

Я почти уверен, что пробовал кучу разных вещей;в том числе: except configparser.MissingSectionHeaderError но без радости.

Чего мне не хватает? Мне нужен код для работы как в Python2, так и в Python3 в обозримом будущем ... по крайней мере, в ближайшие 9 месяцев.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

@ mkrieger1 был прав на деньги. Ключ был также import configparser

import configparser
from configparser import ConfigParser

logOutCfg = ConfigParser()

try:
 if (os.path.isfile(logOutfilename)) : logOutCfg.read(logOutfilename)
except configparser.MissingSectionHeaderError as e:
 pass
except configparser.ParsingError as e:
 print(str(e))
 pass
0 голосов
/ 09 ноября 2019

Ваш код Python 3.6 в основном правильный. Единственная проблема заключается в том, что вы пытаетесь получить исключения из класса ConfigParser вместо модуля configparser. Основное замешательство здесь, скорее всего, связано с тем, что имя модуля изменилось в Python 3, чтобы оно стало более встроенным в стандарты PEP8 . Изначально модуль и класс ConfigParser имели одно и то же имя, но в Python 3 это не так.

Приведенный ниже код должен работать в Python 2 и 3.

try:
    import configparser
except ImportError: 
    import ConfigParser as configparser

logOutCfg = configparser.ConfigParser()

try:
    if (os.path.isfile(logOutfilename)):
        logOutCfg.read(logOutfilename)
except configparser.MissingSectionHeaderError as e:
    pass
except configparser.ParsingError as e:
    print(e)

Вот краткое описание того, что здесь происходит.

try:
    import configparser
except ImportError: 
    import ConfigParser as configparser

Попробуйте импортировать модуль Python 3 configparser. Если в Python 2 это повысит ImportError. Мы ловим это и вместо этого импортируем ConfigParser и используем псевдоним с помощью configparser.

logOutCfg = configparser.ConfigParser()

. Получаем класс ConfigParser из модуля configparser, импортированного выше, и создаем его экземпляр.

try:
    if (os.path.isfile(logOutfilename)):
        logOutCfg.read(logOutfilename)
except configparser.MissingSectionHeaderError as e:
    pass
except configparser.ParsingError as e:
    print(e)

Попробуйте открыть файл, как и раньше, но вместо того, чтобы пытаться получить исключения из класса ConfigParser, получите их из модуля configparser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...