使用run-python的时候,可以指定buffer名吗

比如我有多个项目,想在不同的项目运行对应的虚拟环境,这样子不知道有没有办法

这个包应该就能满足你的需求,配合 veve 来管理 python 的虚拟环境的。

关于 venv 的使用,请看 Python 的官方文档: https://docs.python.org/zh-cn/3/tutorial/venv.html

这个确实可以,但是pip的路径好像没有使用venv的

可以看下 venv 的文档啊,里面有说怎么通过 venv 安装和激活虚拟环境。python 和相关的包都会安装到.venv 这个文件夹下。虚拟环境是独立的。

用来 pyvenv 这个 Emacs 包,就可以在不同项目下激活不同的虚拟环境,然后你 run-python 的交互环境也就是相应的虚拟环境了。

比如我在 Windows 下的话,还可以在项目下直接写好需要用到的依赖,写一个安装脚本,当然也可以手动执行。

PythonVenv.bat

py -3 -m venv %CD%\.venv
.venv\Scripts\python -m pip install -r %CD%\requirements.txt

reguirements.txt 里面写依赖的名字

comtypes==1.1.10
psutil==5.8.0

这是我的配置,你可以参考一下

(use-package pyvenv
  :after python
  :hook (python-mode . pyvenv-mode)
  :config
  ;; Set correct Python interpreter
  (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"))))))
  (setq pyvenv-post-deactivate-hooks
        (list (lambda ()
                (setq python-shell-interpreter "python3")))))

谢谢你的代码,可能venv我不会用吧,所以我手写了一段,想实现启动 python 的时候将buffer名改成自定义的,不知道有什么方法,因为比较菜,大佬勿笑 :joy:

 (defun mo-run-python ()
    "自定义运行python"
    (interactive)
    (let ((mo-project-python-buffer-name (format "%s[%s]" "Python" (projectile-project-name))))
      (if (get-process mo-project-python-buffer-name)
          (progn
            ;; 将“Python”buffer放入下面window(先判断是否在下面window)
            ;; ()
            (display-buffer (get-buffer "*Python*"))
            (python-shell-send-buffer))
        (progn (set-workon-home-by-venv (projectile-project-root))
               (run-python)
               (display-buffer (get-buffer "*Python*"))
               (python-shell-send-buffer)
               ))))

(defun set-workon-home-by-venv (project-path)
    "如果存在虚拟venv,则设置 WORKON_HOME 为虚拟环境路径"
    (if (file-exists-p (concat project-path "/.venv"))
        (setenv "WORKON_HOME" (concat project-path "/.venv"))
      (if (file-exists-p (concat project-path "/venv"))
          (setenv "WORKON_HOME" (concat project-path "/venv"))
        (when (and (executable-find "python3")
                   (string= python-shell-interpreter "python"))
          (setq python-shell-interpreter "python3"))))
    (when (getenv "WORKON_HOME")
      (setq python-shell-interpreter (concat (getenv "WORKON_HOME") "/bin/python3"))))

direnv

emacs-direnv

.envrc

layout python

多谢,我研究下

还有人写了一个 pyvenv-auto,加强 pyvenv,这样就不用手动激活

GitHub - nryotaro/pyvenv-auto