15

curses既存の端末ではなく、関数へのすべての呼び出しがその端末で動作するように、2 番目の端末を作成する方法はありますか? 対話的に物事を試すことができると、作業がはるかに高速になるため、ある端末で対話型の Python インタープリターを実行し、別の端末で curses の出力を確認できるようにしたいと考えています。

そのままでは、対話型ウィンドウでの呼び出しinitscr()が失敗する (PyDev) か、ホストからウィンドウの更新が完全に取り消される (Spyder) か、コンソール (IPython) で奇妙な動作が発生します。

を使用して別の端末を引き継ぐことはできsetupterm()ますか? もしそうなら、どこでTERMそれを呼び出す別の文字列を取得できますか?

4

3 に答える 3

4

code.InteractiveConsole と SocketServer を使用して、Python インタラクティブ シェルをソケットに接続し、それを使用して開発を行うことができます。簡単な例は次のようになります。

import sys
import SocketServer
from code import InteractiveConsole

class InteractiveServer(SocketServer.BaseRequestHandler):
   def handle(self):
        file = self.request.makefile(mode='rw')
        shell = Shell(file)
        try:
           shell.interact()
        except SystemExit:
           pass


class Shell(InteractiveConsole):
    def __init__(self, file):
        self.file = sys.stdout = file
        InteractiveConsole.__init__(self)
        return

    def write(self, data):
       self.file.write(data)
       self.file.flush()

    def raw_input(self, prompt=""):
       self.write(prompt)
       return self.file.readline()

if __name__ == '__main__':
   HOST, PORT = "127.0.0.1", 9999

   server = SocketServer.TCPServer((HOST, PORT), InteractiveServer)
   server.serve_forever()

それを起動して実行したら、別の端末からポート 9999 に接続して、自分のことを行うことができます。このスクリーンショット(PNG)でこれが機能していることを確認できます

InteractiveConsole を使用するための基本は、この投稿から取得されました。私が取り組んでいた別のプロジェクトの SocketServer で動作するように変更しました。

于 2011-09-02T18:50:56.503 に答える
3

curses モジュールはほとんど (完全に?) C レベルで実装されているため、そうは思いません。そのようなフックを提供する可能性は低いですが、言語に精通している場合は、ソースを調べる価値があるかもしれません.

ただし、あなたの質問を読んでいるときに、他のコンテキストで使用する別の手法を考えました。別のターミナル/エディターを介してスクリプトを保存し、 dnotifyコマンド (または単純なポーリング) に 似た手法を使用して、実行中のプログラムにスクリプトをロードすることができます。

別のアイデアは、ソケットを使用してコマンドを送信し、それらを実行することです。もちろん、これはセキュリティ上危険ですので、必要な予防措置を講じてください。

いくつかのインフラストラクチャを構築する必要がありますが、curses に複数のデバイスのサポートを追加するよりもはるかに簡単です。

于 2011-08-31T20:42:46.047 に答える
0

うーん、あなたがやろうとしていることを完全に理解しているかどうかはわかりません。しかし、私が理解したことは、コードを動的に入力できる標準の python コンソールが必要だということです。しかし、たとえば関数を呼び出すと、この関数の処理の出力が別の端末に表示されますか?

まあ...それが機能するためには、使用するアーキテクチャは「クライアントサーバー」になると思います。

プロセスには stdout と stderr があり、マルチプロセッシング アーキテクチャでは stderr を関数の出力パイプとして使用できるためです。しかし、問題は、メインの端末とは別の端末を初期化することです。(同じスペース内での重複はありません)。

メインプログラムがサーバーを初期化する場合(サーバーの性質自体のために、別のPythonプロセスで)、接続されているすべてのクライアントに出力を送信します。このようにして、複数の端末クライアントやサーバーに接続できる別のコンピューターで関数の出力を視覚化できます。

私の意見では、「curses」パッケージを使用するよりもはるかに簡単です。しかし、唯一の目的がコードの洞察を得ることである場合、それは複雑すぎると思います (付加価値はありません)。


関数の出力をテキスト ファイル (log.txt) にダンプするオプションがまだあります。

于 2011-08-30T09:49:18.443 に答える