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

我正在开始一个将在Docker容器中运行的Django应用程序。 我希望能够在Emacs中使用交互式Python ,在Docker容器和Django应用程序的上下文中执行代码。 基本上我想要Emacs使用的Python解释器在Docker容器中运行。

我已经设法达到这一点,大部分是通过创build一个修改的Dockerfile,它只是不同于我的实际Dockerfile容器,而不是调用它结束的Django命令:

CMD ./manage.py shell 

这意味着当我运行该Docker容器时,我得到了一个实际在容器中运行的Django解释器。 我有Elpy调用这个时启动一个python shell通过添加:

 (setq python-shell-interpreter "/path_to_my_script/run_shell.sh") 

到我的.emacs.d / init.el文件。 其中“/path_to_my_script/run_shell.sh”脚本是运行容器的脚本。

这实际上是大部分工作。 我可以突出显示一行代码,如

 from django.utils import timezone 

并运行Emacs命令elpy-shell-send-region-or-buffer并执行代码。 我可以突出显示

 print(timezone.now()) 

它会打印当前时间。 我已经validation,这个代码实际上是运行在我的容器上运行:

 import os print(os.getcwd()) 

并看到我的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' 

我一直无法find以下问题的答案:

  • 为什么codecs.py试图读取一个tmp文件?
  • Python创build的所有临时文件是什么? (如果你有一些python代码在运行,并且在你的/ tmp目录下,你可能会看到很多像py271761jE的文件。)
  • 为什么我的Docker容器中的/ tmp目录是空的? 看起来像Python是想创build和从目录中的文件读取,但失败。
  • 我怎样才能debugging呢?

如果任何人有任何这些问题的答案,这将是一个巨大的帮助。 我一直无法提供有关这个问题的任何信息。 在/ tmp目录中searchpy *文件只是调出tempfile包。

我不知道发生了什么,但我目前的理论是,当一个多行的区域被发送到python shell它需要处理换行符,所以它试图使用编解码器文件。 我想不知怎么这个文件依赖于临时文件和docker的容器搞砸了。 我不知道这个理论有多接近,但我不知道如何进一步调查。

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

我很确定这是发生了什么事情:

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

解决这个问题的最简单方法是将主机的/tmp/目录链接到容器的/tmp/目录。 一些Google使我得到一个命令,如:

 docker run ... -v /tmp:/tmp 

我没有testing过这个代码,但是看起来像是正确的方向。