R-markdown:python-logging软件包似乎引起了问题

时间:2018-09-02 15:14:22

标签: python virtualenv r-markdown

我遇到了一个奇怪的问题,该问题可以追溯到python logging软件包。让我简短地解释一下我想做什么:目标是使用python创建html报告。我正在使用R rmarkdown软件包,该软件包使用本地virtualenv通过reticulate运行python代码。

问题: 安装Python logging软件包后,rmarkdown会在加载matplotlib时出现问题。我编写了一个小的测试脚本来重现该示例。

我的系统:

  • Ubuntu 18.04仿生
  • 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 

系统站点程序包确实具有相同的模块版本。

结果 test 1(没有logging中的所有测试都可以正常工作。 使用virtualenv时, test 2(带有loging中的测试失败。调用rmarkdown::render(见下文)时,使用系统python安装程序(而非virtualenv)时,它们也能很好地工作。

在虚拟环境中安装了reticulate时,logging似乎有些奇怪。

测试脚本的输出(见下文)

包含错误的完整输出:

 ----------- 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: cannot import name cbook”有关,但是那里的解决方案不起作用。

请提前谢谢! R

1 个答案:

答案 0 :(得分:1)

记录became版本2.3的Python库中包含的标准模块。您不得从PyPI安装它。尽快将其删除:

pip uninstall logging