Я столкнулся со странной проблемой, которую я мог отследить до пакета 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