R-markdown:python-logging 包似乎是导致问题的原因
R-markdown: the python-logging package seems to cause the problem
我遇到了一个奇怪的问题,我可以找到 python logging
包。让我简短地解释一下我想做什么:目标是用 python 创建 html 报告。我正在使用本地 virtualenv 的 R rmarkdown package which runs python code trough reticulate。
问题:
一旦我安装 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
)。
- 除了第一个测试:通过
venv/bin/pip
安装logging
。
- 使用
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
) 的所有测试都运行良好。
来自 test 2 (with loging
) 的测试在使用 virtualenv 时失败。当调用 rmarkdown::render
(见下文)时,当使用系统 python 安装(不是 virtualenv)时,它们也工作得很好。
在 virtualenv 中安装 logging
时,reticulate
似乎有些奇怪。
测试脚本的输出(见下文):
包含错误的完整输出:
----------- 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')"
我最初以为它与问题“”有关,但那里的解决方案没有用。
提前致谢!
R
记录 became 2.3 版 Python 库中包含的标准模块。你不能从 PyPI 安装它。尽快删除它:
pip uninstall logging
我遇到了一个奇怪的问题,我可以找到 python logging
包。让我简短地解释一下我想做什么:目标是用 python 创建 html 报告。我正在使用本地 virtualenv 的 R rmarkdown package which runs python code trough reticulate。
问题:
一旦我安装 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
)。 - 除了第一个测试:通过
venv/bin/pip
安装logging
。 - 使用
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
) 的所有测试都运行良好。
来自 test 2 (with loging
) 的测试在使用 virtualenv 时失败。当调用 rmarkdown::render
(见下文)时,当使用系统 python 安装(不是 virtualenv)时,它们也工作得很好。
在 virtualenv 中安装 logging
时,reticulate
似乎有些奇怪。
测试脚本的输出(见下文):
包含错误的完整输出:
----------- 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')"
我最初以为它与问题“
提前致谢! R
记录 became 2.3 版 Python 库中包含的标准模块。你不能从 PyPI 安装它。尽快删除它:
pip uninstall logging