RMarkdown Matplotlib问题中的Python

2024-04-28 05:55:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用reticulate在一个RMarkdown文档中运行一些简单的Python代码。我发现,如果Matplotlib在conda环境中,我在尝试运行python代码块时会出错,但我可以直接从R运行python。以下是我所看到的一个简单示例:

---
title: "Reticulate Test"
date: "9/21/2020"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(reticulate)
use_condaenv('Toy_MPL') # this environment contain matplotlib and produces the error
#use_condaenv('Toy') # this environment does not contain matplotlib and no error
```

```{r}
# this works regardless of which environment I use
pysys <- import('sys')
pysys$version
```

[1] "3.8.5 (default, Sep  4 2020, 02:23:17) \n[Clang 10.0.0 ]"

```{python, engine.path = '/opt/miniconda2/envs/Toy_MPL/bin/python'}
# if Toy_MPL conda environment is used, the error is generated
# if Toy conda environment is used, I get the same output as above
import sys
print(sys.version)
```
Error in py_call_impl(callable, dots$args, dots$keywords) : 
  TypeError: use() got an unexpected keyword argument 'warn'

我的第一个想法是,在安装Matplotlib时,reticulate没有看到安装在conda environment lib/文件夹中的各种系统库-Matplotlib附带了许多依赖项。我尝试了以下方法,但均无效:

  • 将.Renviron中的LD_LIBRARY_PATH设置为指向正确的库路径
  • 调用use_python()作为use_condaenv()的补充或替代
  • 在Python代码块中设置engine.path
  • 我尝试将matplotlib降级到v3.2(建议here),但这导致了一组新的错误:

Error in if (has_compatible_arch && has_preferred_numpy) valid_python_versions <- c(valid_python_versions, : missing value where TRUE/FALSE needed

  • 检查NumPy时,我看到我有v1.19.1(其他错误建议需要>;1.6)。而且,重新安装matplotlib v3.3.1并不能防止出现错误。在这个“修复”之后,我不得不重建整个环境

traceback()给我一个来自netracite.so的CPP堆栈跟踪,这是不可解释的

我的解释是,为RMarkdown创建的环境没有指向正确的库位置,但我无法确定如何正确设置它

系统信息:

  • Mac OS Catalina 10.15.6
  • RStudio v1.3.1073
  • 网状v1.16
  • 康达v4.8.4
  • conda环境中的Python v3.8.5
  • 玩具MPL环境v3.3.1中的Matplotlib

Tags: the代码environment环境matplotlibusesyserror
2条回答

我也遇到了类似的问题。我是python新手,所以我使用Anaconda Navigator来管理我的python环境和包。我通过以下步骤解决了我的问题

  1. 从R上拆下网状包装
  2. 打开Anaconda Navigator并从“环境”页面中删除r网状环境。我还移除了我用Networkite创建的另一个conda环境
  3. 重新安装网状程序包并运行代码

如果您仍然希望将matplotlib与Networkite一起使用,这不会有太大帮助,但如果不使用matplotlib,至少应该让脚本再次运行

在我最初的问题中,我提到了this问题,其中有人建议将matplotlib降级到3.2.0版,因为Networkite并没有随着matplotlib的更改而更新。我进一步跟进了这一建议,并(目前)找到了解决方案

TL;博士

删除matplotlib的pip和conda安装版本,然后使用conda安装matplotlib版本3.2.2(非pip)即可解决此问题。使用pip安装matplotlib会导致其他错误

细节

在对other question的答复中,建议:

pip install matplotlib==3.2  

我尝试了这个,结果发现了其他我也无法追踪的错误。因此,我卸载了matplotlib,然后用

pip install matplotlib==3.3.1

希望能回到我原来的地方。这也不起作用,新的错误仍然存在。然后我用pip完全删除了matplotlib,并用conda重新安装了3.3.1版:

pip uninstall matplolib
conda install matplotlib

这让我回到matplotlib版本3.3.1和我在问题中提到的原始错误。然后,我尝试使用conda安装matplotlib 3.2版:

conda install matplotplib==3.2

安装的版本是3.2.2,而不是响应中建议的3.2.0,但当我这样做时,原来的问题似乎得到了解决

在本例中,pip和conda之间的依赖解析显然存在差异,conda提供了一个matplotlib版本,可以很好地处理reticulate。然而,在这一点上,我不知道有什么区别

相关问题 更多 >