折腾 pyenv virtualenv

之前成功的经验:

  1. pyenv
  2. pyenv-virtualenvwrapper
  3. WORKON_HOME

上面这些都设置好之后,就可以用EMACS的 (pyvenv-workon)来激活虚拟环境

新的问题:

最近重装系统,从 bash 换到 fish,遇到以下问题:

  1. fish 下设置 pyenv 和 bash 下有很大不同
  2. pyenv-virtualenvwrapper 并没有提供 fish 下的安装设置方法,并且代码已有三年未更新,于是换到 pyenv 推荐的 pyenv-virtualenv 插件来管理虚拟环境
  3. 无法使用 emacs 的 pyvenv 来激活 pyenv-virtualenv 创建的虚拟环境

大家有遇到这个问题吗?又是怎样解决的呢?

突然发现 fish 给我带来的麻烦比想象中更多 :joy:

几年的使用习惯真的不是一朝一夕就能改变的

召唤用 fish 的大佬(如果我没记错的话 :joy: ), @twlz0ne

可不可以采取 pyvenv (instead of pyenv) + conda 的方式? 我在spacemacs中,切换python virtual 环境是这样展开的。自己配置emacs.d的时候,也继续这样的方式。

我可能还是被 fish 的特性给坑了,刚刚定位到原因可能是 spacemacs 的内置函数因为 fish 的 greeting 消息坏掉了。等下解决了在这里分享一下情况。

1 个赞
  • 有没有想过自己搞自己的emacs 配置,独立spacemacs 但借鉴它的feature?
  • pyenv-virtualenvwrapperconda 我理解是两种不同的python 虚拟环境管理策略,当然后者不仅仅是针对python。 前者我基本不用,有什么特性你比较喜欢的么,还是场景所限不能用conda
  • 不想,我还是挺喜欢 spacemacs 的,虽然有点肿,但是已经习惯了它的按键绑定;自己的配置写点 private layer 就好了。
  • pyenv 可以选择安装 conda,pyenv-virtualenvwrapper 管理的是 Python 虚拟环境,conda 相当于 python的发行版和包管理器吧?而且 conda 的Python应该也可以用 virtualenv?不经常用 conda,因为习惯了 pip,感觉比 conda 要轻,依赖管理也挺方便。
  • 总结下来,最主要的原因是懒 :joy:
1 个赞
  (defun spacemacs/pyenv-executable-find-advice (orig-fun command)
    (if (executable-find "pyenv")
        (progn (message "found pyenv")
               "ipython")
      (executable-find command)))
  (advice-add 'spacemacs/pyenv-executable-find :around #'spacemacs/pyenv-executable-find-advice)

  (defun spacemacs//python-setup-shell-advice (orig-fun &rest args)
    (setq python-shell-interpreter "ipython")
    (setq python-shell-interpreter-args "--simple-prompt -i --pylab=qt --gui=qt")
    )
  (advice-add 'spacemacs//python-setup-shell :around #'spacemacs//python-setup-shell-advice)

写了两个 advice 放到 user-init 里,问题解决。

虽然带来了这些麻烦,不过 fish 的 greeting message 看着是挺酷炫就是了 :joy:

其实最方便的还是在项目根目录下:pyenv local [指定的python解释器标签]

1 个赞

嗯嗯,我自己也是很喜欢spacemacs的绑定。我最近实验看到,其实可以完全利用usage-package,结合general 设置一样的key-binding。 (我比较喜欢的一个是SPC作为leader key,一个是window的切换,再者是逗号作为major-mode leader key。)

1 个赞

可以用zsh,zsh我感觉已经足够好了,fish的很多特性在zsh里装个插件也能得到,而zsh至少语法和bash很像

用virtualenv/virtualenvwrapper管理python虚拟环境最简单的办法:

  • 在shell下先启动虚拟环境,workon 虚拟环境名 进入虚拟环境
  • 在虚拟环境下启动emacs/vim/nvim等编辑器,正常使用代码编辑功能

现在连 workon 都不需要了,直接 pyenv global myvenv 了(当然也可以 pyenv local),进入 emacs (不一定从终端启动,也可以从桌面启动) 时自动进入虚拟环境。

我这个帖子里的问题主要是 fish 的启动信息造成的,也已经在坛友的帮助下解决了。

在 fish 下 source (pyenv init - | psub) 无效吗?

虽然我主用 fish,但系统默认还是 bash,主要配置的也是 bash。

我只在 tmux 中使用 fish。但我的 Iterm2 也只开两个 bash 窗口实例:一个运行 tmux,一个运行 Emacs。所以我也算全天使用 fish。

采用这个策略也是早期被 fish 坑过。这样一旦出问题可退回 bash。

从 bash 进入 fish,除了 XXXenv 需要重新初始化之外,大部分设置都正常继承。

1 个赞

之前我是纠结过在emacs/vim中如何管理虚拟环境的问题,在emacs中用pyenv管理很方便,vim中有些难处理,后来想通了直接在shell中切到虚拟环境下再启动编辑器,不就和使用系统默认的一个玩法了,是粗鲁了点了,好用就行