我开始开发将在 Docker 容器中运行的 Django 应用程序。我希望能够在 Emacs 中使用交互式 python,它在 Docker 容器和 Django 应用程序的上下文中执行代码。本质上,我希望 Emacs 使用的 Python 解释器在 Docker 容器中运行。
在很大程度上,我通过创建一个修改后的 Dockerfile 来实现这一点,该 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())
它将打印当前时间。我已经通过运行验证了这段代码实际上是在我的容器上运行的:
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'
我一直无法找到以下问题的任何答案:
- 为什么 codecs.py 试图读取 tmp 文件?
- Python 创建的所有临时文件是做什么用的?(如果您正在运行一些 python 代码并查看/tmp目录,您可能会看到很多文件,例如py271761jE。)
- 为什么我的 Docker 容器中的 /tmp 目录是空的?似乎 Python 想要创建并读取该目录中的文件但失败了。
- 我该如何调试呢?
如果有人对这些问题中的任何一个有任何答案,那将是一个巨大的帮助。我一直无法找到有关此问题的任何信息。谷歌搜索 /tmp 目录中的 py* 文件只会显示 tempfile 包。
我不知道发生了什么,但我目前的理论是,当一个多行区域被发送到 python shell 时,它需要处理换行符,因此它尝试使用编解码器文件。我认为这个文件不知何故依赖于临时文件,而 docker 容器把它搞砸了。我不知道这个理论有多接近,但我不知道如何进一步研究它。