#python #python-3.x
#python #python-3.x
Вопрос:
Я пытаюсь запустить следующий скрипт с именем msgpack_checker.py
на Python 3:
import msgpack
from faker import Faker
import logging
from logging.handlers import RotatingFileHandler
fake = Faker()
fake.seed(0)
data_file = "my_log.log"
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
handler = RotatingFileHandler(data_file, maxBytes=2000, backupCount=10)
handler.terminator = "" # Suppress the newline character (only works in Python 3)
logger.addHandler(handler)
fake_dicts = [{'name': fake.name()} for _ in range(100)]
for item in fake_dicts:
dump_string = msgpack.packb(item)
# print dump_string
logger.debug(dump_string)
unpacker = msgpack.Unpacker(open(data_file))
print("Printing unpacked contents:")
for unpacked in unpacker:
print(unpacked)
когда я запускаю его с помощью Python 2, он выводит следующий вывод:
Printing unpacked contents:
{'name': 'Joshua Carter'}
10
{'name': 'David Williams'}
10
{'name': 'Joseph Jones'}
10
{'name': 'Gary Perry'}
10
{'name': 'Terry Wells'}
10
{'name': 'Vanessa Cooper'}
10
{'name': 'Michael Simmons'}
10
{'name': 'Nicholas Kline'}
10
{'name': 'Lori Bennett'}
10
Числа «10», я полагаю, поступают из регистратора и должны быть удалены в Python 3 с помощью handler.terminator = ""
команды. Однако, если я попытаюсь запустить скрипт с помощью python3 msgpack_checker.py
, я получаю следующую ошибку:
Traceback (most recent call last):
File "msgpack_checker.py", line 3, in <module>
import logging
File "/home/kurt/Documents/Scratch/logging/__init__.py", line 26, in <module>
import sys, os, time, cStringIO, traceback, warnings, weakref
ImportError: No module named 'cStringIO'
По-видимому, logging
модуль пытается импортировать cStringIO
напрямую, чего больше не существует в Python 3. Я видел исправления, которые включают импорт StringIO
из io
вместо StringIO
, но я не уверен, что они будут работать здесь. Есть предложения о том, как заставить этот скрипт работать в Python 3?
Комментарии:
1. Но, похоже, это ваш код в
logging/__init__.py
. Если вы хотите, чтобы он работал в Python 3, вам нужно будет использовать правильный импорт для этой версии.2. Похоже, у вас есть свой собственный модуль, который
logging
называется, который импортируется. Я бы предложил переименовать эту папку во что-то другое.3. Итак, откуда берется ваш
logging
пакет? Это не стандартный пакет библиотеки. Вы маскируете его чем-то другим. Переместите это «что-то еще» в сторону.
Ответ №1:
Как указано в нескольких комментариях, я случайно оставил каталог logging
в том же каталоге, к которому относится сообщение об ошибке. После удаления этого каталога я получаю другое сообщение об ошибке,
Printing unpacked contents:
Traceback (most recent call last):
File "msgpack_checker.py", line 27, in <module>
for unpacked in unpacker:
File "msgpack/_unpacker.pyx", line 459, in msgpack._unpacker.Unpacker.__next__ (msgpack/_unpacker.cpp:459)
File "msgpack/_unpacker.pyx", line 380, in msgpack._unpacker.Unpacker._unpack (msgpack/_unpacker.cpp:380)
File "msgpack/_unpacker.pyx", line 370, in msgpack._unpacker.Unpacker.read_from_file (msgpack/_unpacker.cpp:370)
TypeError: expected bytes, str found
но это отдельная проблема; по крайней мере, импорт logging
был успешным.
Комментарии:
1. Если у вас есть новый вопрос, пожалуйста, задайте новый вопрос, а не добавляйте его в качестве ответа здесь или пытайтесь изменить свой существующий вопрос.
2. И решением новой ошибки является открытие файла в двоичном режиме вместо этого:
open(data_file, 'b')
.