2017-08-09 5 views
0

私は非常に単純な問題がありますが、どこでも簡単な解決策を得ることはできません。 私は自分の端末上で実行しているアプリケーションを持っています。これは、端末に入力して引数を渡すことから始めます。たとえば、PythonでPython 3を開いてコンソールアプリケーションを制御する

この結果、コンソールアプリケーションが開始され、期待どおりにキーボード入力が可能になります。

ここで私がしたいのは、これまでに説明したプロセスをPythonアプリケーションから繰り返すことです。私のpythonアプリケーションは、ターミナルでmyExampleAppを開き、コンソールウィンドウへの参照を取得し、PythonアプリケーションからのコマンドをキーボードプレスとしてmyExampleAppに送ることができるはずです。

Windowsプラットフォームでは、pywinautoライブラリが機能します。

自分のPi3で動作するLinuxで説明したことを実行するための最良のオプションは何ですか?

非常に参考になります。

+0

pythonの 'subprocess'モジュールを見てください。 – cdarke

+0

pywinautoはGUIアプリケーション用です、なぜコンソール用に使用しますか? +1は 'サブプロセス 'になります。 –

答えて

0

コマンドを受け取るためにhttps://docs.python.org/2/library/cmd.htmlを見てください。あなたのアプリケーションは、別のユーザーが提案したサブプロセスで実行できます。

import cmd 
import sys 
import subprocess 
class Controller(cmd.Cmd): 
    cmd = 'while true; do cat /dev/stdin;sleep 1;done' 
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 

    def default(self, cmd): 
     self.p.stdin.write(cmd+"\n") 
     a=self.p.stdout.readline() 
     sys.stdout.write("subprocess returned {}".format(a)) 
     sys.stdout.flush() 

if __name__ == '__main__': 
    try: 
     Controller().cmdloop() 
    except: 
     print('Exit') 

このスクリプトを実行すると、CLIインターフェイスが表示されます。送られたコマンドは、アプリケーションの標準に転送されます(シェルスクリプトでシミュレートされています)。

戻ってくる標準出力を処理する必要がない場合は、self.p.stdout.readline()コールをスキップできます。戻りデータが必要な場合は、readline()呼び出しをread()に変更すると便利です。これは、アプリケーションがEOFを送信するまで読み取ります。

あなたのアプリケーションのsudo要件は、おそらくsudoでpythonスクリプトを実行することによって克服することができます。私はセキュリティ専門家ですが、Popenコールのshell = Trueパラメータだけでなく、sudoとしてスクリプトを実行するセキュリティ上のリスクにも注意してください。

関連する問題