如何将Emacs的Elpy in-buffer python解释器连接到docker容器?

Kur*_*ler 7 django emacs python-3.x docker elpy

我开始研究将在Docker容器中运行的Django应用程序.我希望能够在Emacs中使用交互式python,它在Docker容器和Django应用程序的上下文中执行代码.基本上我希望Emacs使用的Python解释器在Docker容器中运行.

我已经设法通过创建一个修改后的Dockerfile来实现这一点,这个Dockerfile只与我的实际Dockerfile容器不同,而不是调用它结束的Django命令:

CMD ./manage.py shell
Run Code Online (Sandbox Code Playgroud)

这意味着当我运行Docker容器时,我得到一个实际在容器内运行的Django解释器.我通过添加以下命令启动python shell时调用了Elpy:

(setq python-shell-interpreter "/path_to_my_script/run_shell.sh")
Run Code Online (Sandbox Code Playgroud)

到我的.emacs.d/init.el文件."/path_to_my_script/run_shell.sh"脚本是运行容器的脚本.

这实际上是工作的大多数部分.我能够突出显示一行代码,例如

from django.utils import timezone
Run Code Online (Sandbox Code Playgroud)

并运行Emacs命令elpy-shell-send-region-or-buffer ,它将执行代码.然后我可以强调一下

print(timezone.now())
Run Code Online (Sandbox Code Playgroud)

它会打印当前时间.我已经验证这个代码实际上是通过运行在我的容器上运行:

import os
print(os.getcwd())
Run Code Online (Sandbox Code Playgroud)

并查看我的Docker容器用户的主目录.

我仍然使用此设置的问题是当我尝试使用相同的elpy-shell-send-region-or-buffer命令同时执行多行python时.当我突出显示多行并执行该命令时,我在python shell中得到以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.5/codecs.py", line 895, in open
    file = builtins.open(filename, mode, buffering)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/py10324GOe'
Run Code Online (Sandbox Code Playgroud)

我一直无法找到以下问题的任何答案:

  • 为什么codecs.py试图读取tmp文件?
  • Python创建的所有临时文件是什么?(如果你运行了一些python代码并查看你的/ tmp目录,你可能会看到很多像py271761jE这样的文件.)
  • 为什么我的Docker容器中的/ tmp目录为空?似乎Python想要创建和读取该目录中的文件但是失败了.
  • 我该怎么调试呢?

如果有人对这些问题中的任何一个有任何答案,那将是一个巨大的帮助.我无法提供有关此问题的任何信息.在go/tmp目录中搜索py*文件只会打开tempfile包.

我不知道发生了什么,但我现在的理论是,当一个有多行的区域被发送到python shell时,它需要处理换行符,所以它尝试使用编解码器文件.我想某种程度上这个文件依赖于临时文件而且docker容器搞砸了.我不知道这个理论有多接近,但我不知道如何进一步研究它.

Bri*_*orn 6

为什么codecs.py试图读取tmp文件?

我很确定这就是发生的事情:

  1. Emacs将代码写入 /tmp/py10324GOe
  2. Emacs指示Python加载 /tmp/py10324GOe
  3. Python失败,因为容器无法访问主机/tmp/.容器有自己独立的/tmp/目录.

解决此问题的最简单方法是将主机的/tmp/目录链接到容器的/tmp/目录.一些谷歌搜索引导我到如下命令:

docker run ... -v /tmp:/tmp
Run Code Online (Sandbox Code Playgroud)

我还没有测试过这个代码,但它似乎是正确的方向.