2017-04-03 85 views
2

我開始研究將在Docker容器中運行的Django應用程序。我希望能夠在Emacs中使用interactive python,該代碼在Docker容器和Django應用程序的上下文中執行代碼。基本上我想讓Emacs使用的Python解釋器在Docker容器中運行。如何將Emacs的Elpy in-buffer python解釋器連接到docker容器?

我已成功地做到這一點大部分通過創建修改Dockerfile這是因爲只有從我的實際Dockerfile容器不同,而不是調用它結尾的Django的命令:

CMD ./manage.py shell 

這意味着,當我運行該Docker容器時,我得到了一個實際在容器中運行的Django解釋器。我加入開始一個python shell時Elpy調用此:

(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()) 

,看到主目錄爲我多克容器的用戶。

我仍然在使用此設置的問題是,當我嘗試使用相同的elpy-shell-send-region-or-buffer命令同時執行多行python時。當我選中多行和執行命令我得到的蟒蛇殼內以下錯誤:

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' 

我一直無法找到任何回答以下問題:

  • 爲什麼編解碼器.py試圖讀取一個tmp文件?
  • Python創建的所有臨時文件是什麼? (如果你有一些Python代碼運行,看看你的/ tmp目錄你可能會看到很多文件像py271761jE
  • 爲什麼/ tmp目錄空在我的碼頭工人集裝箱?看起來Python似乎想創建和讀取目錄中的文件,但是失敗。
  • 我該如何調試?

如果任何人有任何這些問題的答案,這將是一個巨大的幫助。我一直無法提供有關此問題的任何信息。在/ tmp目錄中搜索py *文件只是調出tempfile包。

我不知道發生了什麼,但我目前的理論是,當一個多行區域被髮送到python shell時,它需要處理換行符,以便它嘗試使用編解碼器文件。我認爲這個文件依賴於臨時文件,而docker容器正在搞砸這個文件。我不知道這個理論有多接近,但我不知道如何進一步調查。

回答

2

爲什麼codecs.py試圖讀取tmp文件?

我敢肯定,這是發生了什麼事:

  1. 的Emacs寫代碼/tmp/py10324GOe
  2. Emacs的指示Python加載/tmp/py10324GOe
  3. Python的失敗,因爲容器不能訪問主機的/tmp/。該容器有其自己的單獨/tmp/目錄。

解決此問題的最簡單方法是將主機的/tmp/目錄鏈接到容器的/tmp/目錄。一些谷歌搜索使我的命令,如:

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

我沒有測試的代碼,但它似乎是一個正確的方向。

相關問題