[吐槽] conda 真是太难用了! 如何优雅地管理 Python 环境?

355 天前
 vituralfuture

如题,已经在 anaconda 上折腾了不知道多久,我现在已经彻底放弃使用 conda 了,看到一个比较新的包管理器 pdm ,但是 pycharm 现在还不支持,所以就用 virtualenv 了

首先,我的机器是 archlinux ,然后现在还是大二学生,SRTP 项目是机器学习方向的,然后其他比赛也需要用到 numpy, pandas, pytorch 这一堆东西

当我还在用 windows 时,根本不 care 什么虚拟环境,啥包都是无脑装到系统解释器,当时需要的科学计算有关的库,最多就是 numpy,pytorch.matplotlib 这些东西,也没有啥版本要求,直接用最新的版本,用的库也不是很多,这种方法没啥问题

然后主力切换到 linux 后,我发现 linux 的 python 系统解释器很重要,因为它是系统依赖之一,也出现过不规范操作,导致 python 一个解析 JSON 的库出错,然后 pip 依赖这个库,导致 pip 也不能工作,还有一次手贱卸载了一个不知道是干啥用的库,导致有些软件用不了了,从此我只敢在系统解析器安装 requests 这种比较小的库,用来写爬虫,其他都安装到虚拟环境

后来,因为想尝试一下 conda ,所以我安装了 conda ,遇到第一个问题就是,安装后在我的 shell 里没有 conda 这个命令,然后网上找到的教程,他们的 conda 基本都是安装到用户的家,而我安装到 /opt 下的,没法借鉴。后来我从 aur 里发现,打包的人说“为了不污染环境,把 conda 作为一个函数在 shell 中调用,导入这个函数需要执行一个脚本”,然后我把这个脚本加到了~/.zshrc里,登录就执行一遍,这个问题折腾了几小时

再后来,我发现 conda 安装库老是卡死,先声明,我已经搭建了一个透明代理的环境,网络是不存在问题的,它总是卡在解析依赖的地方,实在不想等

有一次 archlinux 系统更新的时候,archlinux 的包管理器 pacman 检测到/opt/anaconda/...下面很多头文件冲突了,没法安装系统更新,我在 reddit 找到了类似的问题,解决办法:卸载 conda ,安装系统更新,重新安装 conda 。 代价就是,我的一堆环境全部重新安装。。。

最后一次,也就是一天前,我执行一行代码,从 raw.githubusercontent.com 下载一个 scv 文件,遇到一个问题:ssl 证书不能验证

其实之前我就发现,当我进入 conda 的环境时,使用curl命令,用的不是系统的 curl,而是/opt/anaconda/bin/curl命令,然后使用 curl 命令从 raw.githubusercontent.com 下载一个文件时,也出现了同样的问题:ssl 证书不能验证。当时我用/usr/bin/curl来简单地避开了这个问题

但是,这次 python 代码需要从 raw.githubusercontent.com 下载 csv 文件,没有一个方法能 workaround 掉这个问题,然后我 google 了几小时,大概是"conda ssl", "conda ssl certificate", "conda curl ssl", "conda lack of ssl certificate”,都没有找到这个问题

我尝试过:

  1. 浏览器打开 raw.githubusercontent.com ,导出 pem 文件,加入到 conda 环境下的 ssl 证书文件末尾
  2. 复制系统的 ssl 证书,覆盖 conda 的证书文件

都没有 work
所以我再也不想使用 conda 了,浪费了我太多时间在这些没用的地方

最开始考虑使用 docker 管理 python 环境,但是有两个问题

  1. docker 里的 python 解释器,它能运行图形化界面吗?比如 PyQt ,matplotlib 等等,这个问题我没有试过,存疑
  2. pycharm 怎么使用 docker 里的解释器?我尝试过,似乎是这么一个逻辑,创建 docker 容器时添加了一个-rm 参数,退出容器时自动销毁,下次进入时,会从 docker image 重新创建一全新的容器,优点就是这个容器是绝对干净的,缺点就是:1. 安装的其他库都会随着 docker 容器一起被删除 2. 有时候需要对库文件作出修改,比如 matplotlib 不能画中文图表,需要对库文件作出修改才能画

现在作为一个折中,使用 virtualenv ,这个东西好用吗?我想其实也不太好用 因为每次进入都太麻烦了!

大佬们是如何解决的?求指点!

9036 次点击
所在节点    Python
90 条回复
RedisMasterNode
355 天前
如果觉得 virtualenv 比较难用的话,可以试试看 virtualenvwrapper 能不能帮你减少一部分工作量。这个组件我用了 5 年多了,很稳定也很方便,所以一直没去了解过其他的虚拟环境管理工具。

https://virtualenvwrapper.readthedocs.io/en/latest/install.html

本质上是 virtualenv 套皮,可以试试看
wafm
355 天前
其实这么多环境里,conda 应该算是门槛低 且 友好的了

前提是 你翻出去了
vituralfuture
355 天前
anaconda 的 ssl 证书文件这个问题,可以复现
步骤:
1. 拉一个 archlinux 的 docker 镜像
2. 安装 aur 里的[anaconda]( https://aur.archlinux.org/packages/anaconda)
3. 进入 conda 主环境`conda activate base`
4. `curl raw.githubusercontent.com `或在 python 中发起 raw.githubusercontent.com 的请求

这种问题,我不确定是 aur 包的问题还是 conda 的问题
ZedRover
355 天前
docker 里的 python 解释器应该是能运行图形化界面的,虽然我没用过但是看这个项目的描述 https://github.com/Ed-Yang/vnpy-docker 应该是可以的。 我一般学校和公司里面用 docker 都是直接装上 openssh-server 然后用 vscode remote ssh 进去写代码,vscode 也可以直接 attach 到 devcontainer 里面,远程开发 pycharm 感觉没 vscode 这么方便,只能起新的容器。
ZedRover
355 天前
@ZedRover docker 还有一个好处可以直接用现成的 cuda 环境,ray stablebaselines3 torch 等官方都有写好的 image ,迁移到新机器上也比较方便,不过还是要依赖宿主机的 nvidia-driver ,所以切换版本也不是特别自由
XunjieL
355 天前
poetry + pyenv, 折腾很多 python 包管理和环境管理工具了,这两个组合已经完全够我用了,以后不会再变了; pyenv 负责管理和下载多个 python 版本,可以一键切换全局 python 版本;在 pyenv 的基础上,poetry (记得换源)的包管理终于能让我不那么费心 python 项目的部署问题了,缺点可能就是分析依赖的时候略慢( python 第三方包鱼龙混杂导致的),现在速度比前几年好很多了。
wangmou
355 天前
conda 搭配代理一直有些七七八八的问题,我都是用国内源,后来就没遇到过这些问题,无论 win 还是 Linux 服务器。
aphyllan
355 天前
目前在用 micromamba + conda-forge ,体验真的比 Anaconda 全家桶好太多。
di94sh
355 天前
https://github.com/mitsuhiko/rye

试试 flask 作者实验品,hhh
conn457567
355 天前
我也是折腾了好久,换来换去,最后还是用 docker 来完全隔离所有开发环境。简单的可以用 asdf+virtualenv ,系统的 python 解释器完全不动,也不手动安装任何包
optional
355 天前
conda 算是比较好用了
alne
355 天前
别的领域不知道,机器学习 conda 算是比较好用的了
Muniesa
355 天前
呃,你是用别人打包的 anaconda 吗?建议装官网的 miniconda ,安装时会有写入 bashrc/zshrc 的提示,装到用户目录也不可能和系统的更新冲突,而且没有你那个 curl…
adoal
355 天前
客户端软件在建立 SSL 连接的时候需要验证对方证书是否在“我认可的”Root CA 链下。这个 Root CA 的列表是储存在本机系统里某个地方的。如果你用的是 Linux 发行版们打包好的软件,通常会改过代码或者编译选项,指定从一个系统默认位置去读。但如果是第三方或者自己编译的,可能软件上游默认并不会去读发行版设置的默认位置,那么 Root CA 列表可能会过时或者缺失。

可以试试这段里提到的 REQUESTS_CA_BUNDLE / CURL_CA_BUNDLE 环境变量 https://requests.readthedocs.io/en/latest/user/advanced/#ssl-cert-verification

把它指到发行版默认的位置去。Arch 我不清楚,deb 系是 /etc/ssl/certs/ca-certificates.crt ,你找找看 Arch 里对应的位置试试看。
RRRoger
355 天前
miniconda
Ricardoo
355 天前
> 后来,因为想尝试一下 conda ,所以我安装了 conda ,遇到第一个问题就是,安装后在我的 shell 里没有 conda 这个命令,然后网上找到的教程,他们的 conda 基本都是安装到用户的家,而我安装到 /opt 下的,没法借鉴。后来我从 aur 里发现,打包的人说“为了不污染环境,把 conda 作为一个函数在 shell 中调用,导入这个函数需要执行一个脚本”,然后我把这个脚本加到了~/.zshrc 里,登录就执行一遍,这个问题折腾了几小时
下载官方原版, 安装结束会询问你是否将命令写入 bashrc ,选择 yes ,重启 terminal 即可。

> 再后来,我发现 conda 安装库老是卡死,先声明,我已经搭建了一个透明代理的环境,网络是不存在问题的,它总是卡在解析依赖的地方,实在不想等。
conda 安装前会检测环境各种包的依赖关系,如果 混合使用 pip 和 conda 安装包 会导致提示 The environment is inconsistent 。依赖解析会非常非常慢,甚至卡死。建议新建的环境里仅使用 conda install 或 pip 安装。保持环境干净

> 有一次 archlinux 系统更新的时候,archlinux 的包管理器 pacman 检测到 /opt/anaconda/...下面很多头文件冲突了,没法安装系统更新,我在 reddit 找到了类似的问题,解决办法:卸载 conda ,安装系统更新,重新安装 conda 。 代价就是,我的一堆环境全部重新安装。。。
请不要使用 aur 安装 anaconda ,下载官方原版,手动安装。

> 使用 curl 命令,用的不是系统的 curl,而是 /opt/anaconda/bin/curl 命令
当你使用 base 环境的时候默认调用的是 anaconda 的 curl ,
1.可以重命名的方法规避系统使用它,mv /opt/anaconda/bin/curl /opt/anaconda/bin/curl1 ;
2.使用 conda 新建环境,在新环境里不会使用 base 环境里的 curl

额外说一句:conda 新建环境并激活后,是将新环境的 bin 目录加载 PATH 路径前面,以此覆盖同名指令。只要这个原理可以帮你排查大部分指令调用的问题。

conda 几乎是 ML 领域最优雅的管理环境的工具。建议多看看官方文档。
vituralfuture
355 天前
@Muniesa 对的,我用的是 aur 源里的 anaconda ,是别人打包好的,用 aur 的原因主要是 archlinux 官方源里只有 free and open source software ,要装其他软件得去 aur 里,用 aur 的好处是更新方便。我试试装到用户目录

至于 curl ,这东西我都无法理解为什么 anaconda 安装目录下会有这东西
连 ssl 证书都有
Trim21
355 天前
有些包 conda 有预编译的 wheel ,pip 没有,用 conda 安装不需要自己解决编译问题。
nah
355 天前
anaconda 的缺点是臃肿,换 miniconda 之类的吧。
jZEdn7k4
355 天前
但机器学习确实主流就是 conda 。。。如果 conda 用不明白的话其他虚拟环境带来的问题只会更多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/938669

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX