Как решить проблему «Нет модуля с именем ‘cStringIO'» при импорте модуля ведения журнала в Python 3

#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') .