8

Python では、次のコード スニペットは実行時にインタラクティブ シェルを開きます。

import code; code.interact(local = locals())

これは、文書化されていないかなりの量のコードのデバッグに非常に役立つことが証明されています。シェルを使用してプログラム内環境をナビゲートし、デバッガーがなくても何が起こっているかを把握できます。ここまでは順調ですね。

今、挑戦。

私が使用しているソフトウェア (ちなみに Django で作成されています) は、ある種のスケジューリング メカニズムを使用しており、別のPython プロセスと通信します。このメカニズムは、コードを編集する以外には制御できません。処理のために送信する変数以外に、入力はありません。

ただし、ドキュメントが非常に貧弱であるため、コードがどのように機能するのかわかりません。そのため、code.interactメソッドを使用して物事を把握したかったのです。

しかし、このプロセスは何らかの特別なスケジューリング ソフトウェアによってバックグラウンドで開始されるため、フローは Django アプリケーションから調べたい部分には進みません。代わりに、シグナルとオブジェクトが送信され、後で完全に異なるプロセスで任意の時間 (10 ~ 200 ミリ秒の間) に実行されます。シグナルとオブジェクトが受信されると、stdin/stdout はまったく見えなくなります。

そのため、stdin/stdout を使用して通信する代わりに、パラメーターcode.interactを指定することで、ファイル ハンドルまたは Unix ソケットを使用できると考えました。ファイルとソケットを使用しreadfuncてこれを試しましたが、役に立ちませんでした。open()

今、私はそれを Django プロセス自体からのみ機能させようとしているので、スケジューリングの問題でさえ問題外であり、対話型シェルが実際に起動している間、すぐにシャットダウンし、コマンドを含むファイルをコンテンツとして受け入れず、 Python コマンドがパイプされる Unix ソケット。

長い話を短くします; code.interactstdin/stdout 以外の方法で呼び出された対話型シェルと通信することは可能ですか? もしそうなら、どのように?

前もって感謝します。

4

1 に答える 1

5

スケジューラーやジャンゴなどについては、完全にはフォローしていません。

しかし、あなたの質問の核心に答えるには:

#!/usr/bin/python

import code

f = open('input.txt', 'r')

def readfunc(prompt):
    return f.readline()

code.interact(readfunc=readfunc)

次に、それを 1 つのターミナルで実行します。

$ ./test.py 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

プロンプトが表示されないことに注意してください。

次に、別のターミナルで次を実行します。

echo "globals()" >> input.txt

最初のターミナルに戻ると、出力が表示されます。

于 2012-08-10T14:33:18.407 に答える