Ошибка записи в Python 3.x: TypeError: требуется объект, похожий на байты, а не 'str' - PullRequest
1 голос
/ 01 октября 2019

Я на Python 3.6.5.

При использовании ведения журнала я получаю следующую ошибку -

"TypeError: требуется объект, похожий на байты, а не 'str'"

В Python 2.x все работало нормально, а также я попытался преобразовать строку в объект Byte, но не смог решить проблему

if __name__ == '__main__':
    config_file = '/source/account_content_recommendation/config/sales_central_config.json'
    try:
        ### Read all the parameters -
        params = json.loads(hdfs.read_file(config_file))

        ### Create the logging csv file -
        hdfs_log_path = params["hdfs_log_path"]
        hdfs.create_file(hdfs_log_path, "starting ... ", overwrite = True)
        log_name = 'Account_Content_Matching'


        global stream
        log = logging.getLogger('Acct_Cont_Log')
        stream = BytesIO()
        handler = logging.StreamHandler(stream)
        log.setLevel(logging.DEBUG)

        for handle in log.handlers:
            log.removeHandler(handle)

        log.addHandler(handler)

        #env = sys.argv[1]
        env = 'dev'
        formatter = logging.Formatter('{0}| %(asctime)s| {1}| %(module)s| %(funcName)s| %(lineno)d| %(levelname)s| %(message)r'.format(log_name, env))
        handler.setFormatter(formatter)

        log.info("starting execution of Account_Content_Matching load")
        #log.info("sys args %s"%(str(sys.argv)))

        def flush_log():
            global stream
            msg = stream.getvalue()
            hdfs.append_file(hdfs_log_path, msg)
            stream.seek(0)
            stream.truncate(0)
            print(msg)
            sys.stdout.flush

    except Exception as error:
        raise error

Я получаю сообщение об ошибке ниже -

Traceback (последний вызов был последним): файл "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/logging/init.py", строка 994, в потоке передачи. write (msg) TypeError: требуется байтовоподобный объект, а не 'str'

Также ...

Сообщение: «запуск выполнения Account_Content_Matching load» Аргументы: () I1001 06:29: 35.870266 140241833649984: 29] запуск выполнения Account_Content_Matching load

1 Ответ

1 голос
/ 01 октября 2019

В настройках вашего логгера вы:

  • Использование BytesIO в качестве потока
  • Передача в него строк

Это не работает, 2 должны быть синхронизированы. Есть 2 способа это исправить. Либо :

  • Использование [Python 3.Docs]: класс io. StringIO ( initial_value = '',newline = '\ n' ) (вместо BytesIO ):

    stream = StringIO()
    
  • Преобразовать все строки в байтов перед передачей их методам регистратора (более сложным и менее понятным, чем первый):

    log.info("starting execution of Account_Content_Matching load".encode())  # log.info(b"starting execution of Account_Content_Matching load")  # For literals
    log.debug(some_string_var.encode())
    
...