2017-04-03 7 views
2

Dockerコンテナ内で動作するDjangoアプリケーションの作業を開始します。私はinteractive pythonをEmacs内から使用して、DockerコンテナとDjangoアプリケーションのコンテキスト内でコードを実行したいと考えています。基本的には、EmacsがDockerコンテナ内で実行するPythonインタプリタを必要とします。これがあることを意味EmacsのElpyインバッファのPythonインタプリタをドッキング・コンテナに接続する方法は?

CMD ./manage.py shell 

は、私はそれがで終わるDjangoのコマンドをその中に私の実際のDockerfileコンテナから異なるだけで修正Dockerfileを作成する代わりに呼び出すことにより、大部分がこれを達成するために管理していますそのDockerコンテナを実行すると、実際にコンテナ内で実行されているDjangoインタプリタが取得されます。

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

を私.emacs.d/init.elファイルに:私は、Pythonシェルを起動するときElpyを追加することによって、これを起動しています。 "/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を同時に実行しようとするときです。私は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シェルに送られたときに、改行文字を処理してコーデックファイルを使用する必要があります。私は何とかこのファイルは一時ファイルに依存していると思うし、ドッカーのコンテナはそれを乱している。私はこの理論がどれほど近いか分かりませんが、それをさらに調べる方法はわかりません。

答えて

2

なぜcodecs.pyがtmpファイルを読み取ろうとしていますか?私は、これは何が起こっているかであるかなり確信して

  1. Emacsは/tmp/py10324GOe
  2. のEmacsにコードを書き、コンテナは、ホストの/tmp/にアクセスすることはできませんので/tmp/py10324GOe
  3. Pythonが失敗をロードするためのPythonを指示します。コンテナには、独自の別の/tmp/ディレクトリがあります。

これを解決する最も簡単な方法は、ホストの/tmp/ディレクトリをコンテナの/tmp/ディレクトリにリンクすることです。一部のグーグルが次のようなコマンドにつながります。

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

私はこのコードをテストしていませんが、正しい方向性のようです。

関連する問題