purcell 的配置如何自动激活 python 虚拟环境?

大家好!我遇到了一个 emacs 的问题向大家请教一下。

我使用 purcell 的配置开发 python,但是它不会自动激活工程目录中的 .venv 虚拟环境。

然后我在网上搜索后想试试 pyvenv-auto-mode,然而我在 .emacs.d/lisp/init-local.el 中添加了如下代码后,用 projectile 打开 python 文件仍然不会自动激活虚拟环境

(when (maybe-require-package 'pyvenv-auto)
  (add-hook 'python-mode
            (lambda ()
              (pyvenv-auto-mode 1))))

但是我打开 python 文件后手动 M-x pyvenv-auto-mode 它就能激活虚拟环境。

想问下大家都是怎么处理虚拟环境问题的?是否是 purcell 有考虑到这个问题但我不会用?上面这段 lisp 为什么没达到预期效果?

任何建议都可以,先谢谢大家~

Purcell 是用 nix 的,我之前看过他官网的一个视频,他是用 direnv 来激活不同的 python环境。

你不用 nix 的话,建议你自己安装一个 pyevenv

(when (maybe-require-package 'pyvenv)
  (add-hook 'python-mode-hook 'pyvenv-mode)
  (setq pyvenv-post-activate-hooks
        (list (lambda ()
                (setq python-shell-interpreter
                      (concat pyvenv-virtual-env
                              (if (eq system-type 'windows-nt)
                                  "scripts/python"
                                "bin/python")))))))

这里我看了下 pyvenv-auto 的源码,它内部已经 hook 了 python-mode ,所以使用下面的代码就可以正常激活工程目录下的 .venv 虚拟环境

(when (maybe-require-package 'pyvenv-auto)
  (pyvenv-auto-mode t))

pyvenv-auto 基于 pyvenv 最近才开发的,是为了自动激活虚拟环境。我是直接使用的 pyvenv,在项目下通过 M-x pyvenv-activate 手动激活。

你使用 pyvenv-auto 的话,已经自动帮你把 pyvenv 这个依赖给装好了。

最终使用了 direnv,这也是 purcell 自己使用的方式(emacs 中的 envrc),用了一段时间,感觉比 .venv 更舒服,一方面是因为 emacs 直接支持;另一方面是使用终端的时候也可以根据文件夹自动切虚拟环境,不用自己手动 activate 了。