GNU/Linux >> Linux の 問題 >  >> Linux

新しいコンソール ウィンドウで Python スレッドを開く

@stark に同意します。GUI がその方法です。

純粋に説明のために、推奨されない非 GUI を次に示します。 スレッド、サブプロセス、名前付きパイプを IPC として使用する方法を示します。

2 つのスクリプトがあります:

  • entry.py :ユーザーからのコマンドを受け取り、コマンドで何かを行い、コマンドラインで指定された名前付きパイプに渡します:

    #!/usr/bin/env python
    import sys
    
    print 'entry console'
    with open(sys.argv[1], 'w') as file:
        for command in iter(lambda: raw_input('>>> '), ''):
            print ''.join(reversed(command)) # do something with it
            print >>file, command # pass the command to view window
            file.flush()
    
  • view.py :エントリ コンソールを起動し、スレッドで定数の更新を出力し、名前付きパイプからの入力を受け取り、それを更新スレッドに渡します:

    #!/usr/bin/env python
    import os
    import subprocess
    import sys
    import tempfile
    from Queue import Queue, Empty
    from threading import Thread
    
    def launch_entry_console(named_pipe):
        if os.name == 'nt': # or use sys.platform for more specific names
            console = ['cmd.exe', '/c'] # or something
        else:
            console = ['xterm', '-e'] # specify your favorite terminal
                                      # emulator here
    
        cmd = ['python', 'entry.py', named_pipe]
        return subprocess.Popen(console + cmd)
    
    def print_updates(queue):
        value = queue.get() # wait until value is available
    
        msg = ""
        while True:
            for c in "/-\|":
                minwidth = len(msg) # make sure previous output is overwritten
                msg = "\r%s %s" % (c, value)
                sys.stdout.write(msg.ljust(minwidth))
                sys.stdout.flush()
    
                try:
                    value = queue.get(timeout=.1) # update value
                    print
                except Empty:
                    pass
    
    print 'view console'
    # launch updates thread
    q = Queue(maxsize=1) # use queue to communicate with the thread
    t = Thread(target=print_updates, args=(q,))
    t.daemon = True # die with the program
    t.start()
    
    # create named pipe to communicate with the entry console
    dirname = tempfile.mkdtemp()
    named_pipe = os.path.join(dirname, 'named_pipe')
    os.mkfifo(named_pipe) #note: there should be an analog on Windows
    try:
        p = launch_entry_console(named_pipe)
        # accept input from the entry console
        with open(named_pipe) as file:
            for line in iter(file.readline, ''):
                # pass it to 'print_updates' thread
                q.put(line.strip()) # block until the value is retrieved
        p.wait()
    finally:
        os.unlink(named_pipe)
        os.rmdir(dirname)
    

試すには、以下を実行してください:

$ python view.py

コンソールまたは端末ウィンドウを使用するのではなく、問題を再検討してください。あなたがやろうとしているのは、GUIを作成することです。 Wx や Tkinter など、必要なことを正確に実行するためのウィジェットを備えたクロスプラットフォーム ツールキットが多数あります。出力用のテキスト ボックスと、キーボード入力を読み取るためのエントリ ウィジェット。さらに、タイトル、ヘルプ、開く/保存/閉じるなどを含む素敵なフレームにそれらをラップできます。


Linux
  1. Tmuxの現在のディレクトリに新しいウィンドウを作成するにはどうすればよいですか?

  2. Gnu Screen:新しいウィンドウ名の変更?

  3. 前のウィンドウと同じディレクトリで新しいターミナル ウィンドウを生成する

  1. 新しいノーチラスウィンドウを開いて表示するためのキーボードショートカット/コマンド?

  2. Linux および gcc 4 での C++ の新しい演算子のスレッド セーフ

  3. Python と Xorg で現在のウィンドウ タイトルを取得する

  1. スレッド ID とスレッド ハンドル

  2. Ctrl-C で Python スクリプトを強制終了できません

  3. top によって報告された Python スレッドの ID