R-markdown: пакет python-logging, кажется, вызывает проблему - PullRequest
0 голосов
/ 02 сентября 2018

Я столкнулся со странной проблемой, которую я мог отследить до пакета python logging. Позвольте мне коротко объяснить, что я хочу сделать: цель состоит в том, чтобы создавать HTML-отчеты с помощью Python. Я использую пакет R rmarkdown , который запускает код Python через сетку с использованием локального virtualenv.

Проблема : Как только я устанавливаю пакет python logging, rmarkdown сталкивается с проблемой при загрузке matplotlib. Я написал небольшой тестовый скрипт для воспроизведения примера.

Моя система:

  • Ubuntu 18.04 Bionic
  • Python 2.7.15rc1

Тестовый сценарий "1" (без logging):

  • Создать новый virtualenv (venv).
  • Используйте venv/bin/pip для установки matplotlib.
  • Выполнить reticulate::import (в конце через rmarkdown::render).

Тестовый скрипт "2" (с logging):

  • Создать новый virtualenv (venv).
  • В дополнение к первому тесту : установить logging через venv/bin/pip.
  • Используйте venv/bin/pip для установки matplotlib.
  • Выполнить reticulate::import (в конце через rmarkdown::render).

Установленные модули (virtualenv):

backports.functools-lru-cache 1.5    
cycler                        0.10.0 
kiwisolver                    1.0.1  
logging                       0.4.9.6 <- only for "test 2"
matplotlib                    2.2.3  
numpy                         1.15.1 
pip                           18.0   
pkg-resources                 0.0.0  
pyparsing                     2.2.0  
python-dateutil               2.7.3  
pytz                          2018.5 
setuptools                    40.2.0 
six                           1.11.0 
subprocess32                  3.5.2  
wheel                         0.31.1 

Пакеты системного сайта имеют одинаковую версию модуля.

Результаты : Все тесты из тест 1 (без logging) работают хорошо. Тесты из test 2 (с loging) не пройдены при использовании virtualenv. При вызове rmarkdown::render (см. Ниже), при использовании системной установки python (не virtualenv) они также работают хорошо.

Кажется, что-то странное с reticulate, когда logging установлен в virtualenenv.

Вывод тестового скрипта (см. Ниже) :

Полный вывод, включая ошибку:

 ----------- no logging package installed ------------
Module(matplotlib)
Module(matplotlib)
 --------- with logging package installed ------------
Error in py_module_import(module, convert = convert) : 
  AttributeError: 'module' object has no attribute 'NullHandler'

Detailed traceback: 
  File "/home/retos/Downloads/venvtest/venv/lib/python2.7/site-packages/matplotlib/__init__.py", line 168, in <module>
    _log.addHandler(logging.NullHandler())
Calls: <Anonymous> -> py_module_import -> .Call
Execution halted
Module(matplotlib)

Выход Module(matplotlib) - это сообщение об успешной загрузке модуля через reticulate::import. Как видно, только один тест не пройден, когда virtualenv используется с установленным logging модулем Python.

Кто-нибудь имеет представление, что может вызвать эти проблемы? Я потратил довольно много времени, чтобы определить источник ошибки, но сейчас я немного растерялся ...

Тестовый скрипт для воспроизведения ошибки :

Вот небольшой скрипт bash / shell для воспроизведения моих тестов.

#!/bin/bash
# New virtual environment and install matplotlib
echo " ----------- no logging package installed ------------"
if [ -d venv ] ; then rm -rf venv ; fi
virtualenv venv &>/dev/null > /dev/null
venv/bin/pip install matplotlib > /dev/null

# Print installed packages
Rscript -e "reticulate::use_python('venv/bin/python'); reticulate::import('matplotlib')"
Rscript -e "reticulate::import('matplotlib')"

# New virtual environment and install logging and matplotlib
echo " --------- with logging package installed ------------"
if [ -d venv ] ; then rm -rf venv ; fi
virtualenv venv > /dev/null
venv/bin/pip install logging > /dev/null
venv/bin/pip install matplotlib > /dev/null

# Print installed packages
Rscript -e "reticulate::use_python('venv/bin/python'); reticulate::import('matplotlib')"
Rscript -e "reticulate::import('matplotlib')"

Сначала я подумал, что это связано с проблемой " ImportError: невозможно импортировать имя cbook ", но решение там не сработало.

Может заранее спасибо! R

1 Ответ

0 голосов
/ 02 сентября 2018

Ведение журнала стало стандартным модулем, включенным в библиотеку Python в версии 2.3. Вы не должны устанавливать его из PyPI. Удалить его как можно скорее:

pip uninstall logging
...