【问题标题】:Emacs and conda workaroundEmacs 和 conda 解决方法
【发布时间】:2019-03-15 05:10:59
【问题描述】:

我正在使用 emacs 和 anaconda。

我的 init.el 中有这个:

(setenv "WORKON_HOME" "/home/user/anaconda3/envs/")

还有康达在我的路上:

# added by Anaconda3 installer
export PATH="/home/user/anaconda3/bin:$PATH"

但是 emacs 找不到我的 conda 环境,我知道它应该能够做到这一点..

所以,当我运行C-c C-p 来启动一个新会话和C-c C-c 时,它无法使用ModuleNotFoundError 导入我安装在conda 环境中的包。

由于我已将此添加到我的路径中,但它仍然无法正常工作,我正在尝试解决此问题,并且仍然能够从 emacs 运行我的 conda 应用程序。

我可以用M-x shell在emacs中打开一个shell,然后source activate myenv,然后运行python

我现在想将C-c C-c 复制到 /this/ shell。如何将此 shell buffer 标记为 python 进程以将我的 file.py 的文本发送到 C-c C-c,而不仅仅是一个 shell shell ?

更新1

我还查看了以下参考资料:

但是这两个包都不适合我。当我尝试时,我仍然得到:

conda-env-list

*Conda envs*

产生一个空白缓冲区。

这适用于 pyvenv-workon:

pyvenv-workon
  Work on:  (empty)

这些环境非常存在,如果我无法运行我的代码,就无法将 emacs 用作 python IDE。

【问题讨论】:

  • 不完全确定,但看看 Emacs 的 exec-path 变量,这是 Emacs 搜索要运行的程序的地方。至于加载虚拟环境,对我有用的是调用pyvenv-activate

标签: python emacs conda


【解决方案1】:

我发现对我有用的是使用来自 ELPA 的 conda 包并将其两个配置变量设置为指向我的 Conda 目录。以下 sn-p 在我的 .emacs 中发挥作用:

(use-package conda
  :ensure t
  :init
  (setq conda-anaconda-home (expand-file-name "~/miniconda3"))
  (setq conda-env-home-directory (expand-file-name "~/miniconda3")))
  • conda-anaconda-home 等同于 ANACONDA_HOME 环境变量(即包含 Anaconda 安装的所有文件)
  • conda-env-home-directory - 是存储虚拟环境的目录(在 envs 子目录中)

通过此配置,我可以运行 M-x conda-env-activate 并可以访问所有以前创建的环境。

【讨论】:

  • 这是为我做的。谢谢!
  • 谢谢,它对我有用,但是现在,当激活一个环境时,它在运行run-python 后显示Searching for program: No such file or directory, python,它似乎没有在环境中找到 python.exe。
  • @ElBaulP,听起来像是PATH 的问题。尝试将这样的内容添加到您的 .emacs: (add-to-list 'exec-path "~/miniconda3/bin") (setenv "PATH" "~/miniconda3/bin:$PATH" '("PATH"))
  • @WojciechGac 谢谢!,我没有bin/ 子目录,但~/miniconda3 有效,因为python.exe 在其中。
  • @WojciechGac 非常感谢!我的问题是我在:config 下有(setq conda-env-home-directory ...) 而不是:init。谢谢!你的帖子给我带来了问题。
【解决方案2】:

程序从生成它们的 shell 继承环境变量。 conda 和 virtualenv 的工作方式是覆盖 shell 的 PATH 变量。他们这样做是为了让操作系统找到应用程序的新版本(conda 或 virtualenv),而不是随操作系统安装的默认版本(Mac 带有一个古老的 python 版本)。

那么,这里发生了什么?如果您通过双击操作系统图标来启动 Emacs,它将继承默认的 shell 环境变量。因此,当您尝试调用使用 conda(或等效地使用 virtualenv 和 pip)安装的库时,因为您使用的是默认操作系统路径,操作系统正在查找默认版本的 python(并且至关重要的是默认版本的库)。默认版本的 python 会响应“我不知道那是什么库。”

如何解决?一种可靠的方法是通过双击 OS 图标来启动 Emacs。这是我大部分时间都在做的事情:

1) start a console/terminal
2) switch to the conda environment `activate py37` 
    (or with virtualenv: `source .py37dev/bin/activate`)
3) start Emacs from that same shell that has the modified environment variables.  
    On a Mac its: `/Applications/Emacs.app/Contents/MacOS/Emacs` 
    (I use a installed version of Emacs on the Mac because the one that 
    comes with Mac is ancient).  
    On Linux and Windows the path to EMacs will be different but the idea is the same.
4) start a shell inside Emacs and you should see the shell looks the way it does 
    in your conda shell (or virtualenv shell)

这里是我的样子:

看看python的版本怎么不是默认的OS python?它来自 virtualenv + pip 环境(conda 的工作方式完全相同,只是启动环境是不同的命令)

【讨论】:

  • 如何管理可能在不同 conda 环境中的不同 python 项目之间的切换?
【解决方案3】:

我测试了Wojciech GacMittenchopsJames Anderson 的答案中给出的解决方案。

虽然James Anderson's solution 的解决方案是迄今为止最简单的,但它也存在一些问题: 首先,您必须在 emacs 中生成的每个 shell 进程中重新激活环境。还有一种可能是emacs有不同的pythonpath,所以勉强用系统python而不是venvpython。

conda.el 的解决方案有点奇怪。在 Melpa 中,它被列为过时的,并且带有 https://github.com/necaris/conda.el 的说明,它无法识别我的特定机器上的环境。

在同一台机器上,https://emacs.stackexchange.com/a/20093/28567 中提到的带有pyenv 的解决方案非常有效。

因此你只需要安装M-x package-install搜索pyenv,然后在.emacs中插入以下两行:

(setenv "WORKON_HOME" "~/anaconda3/envs") ; /anaconda3 || /miniconda || wathever path your conda installation is located at
(pyvenv-mode 1)

【讨论】:

    【解决方案4】:

    这是我对这个问题的最小解决方案:

    像这样创建一个批处理文件

    conda activate <yourEnv>
    python -i
    

    设置(本地)python-shell-interpreter 指向批处理文件

    像往常一样运行python (C-c C-p ...)

    【讨论】:

      【解决方案5】:

      我知道这不完全是您问题的答案。但是,如果您只想运行代码,请在终端中打开文件所在的目录(例如 cd /Downloads/Chapter01/yourfile.py)。然后,激活环境 (conda activate *your env*) 并传递此命令 (python yourfile.py)。您的代码将由 python 在该环境中执行。 我用 emacs 编辑远程文件并在另一个终端窗口中运行这样的代码。您可能想在调试代码时并排打开两个终端窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        相关资源
        最近更新 更多