2016-11-05 15 views
0

PythonのコマンドラインからAVD(Android Virtual Device)を作成したいと思います。そのためには、文字列nをstdinに渡す必要があります。私は何ができる私は、次のstdinに文字列を渡す

emulator_create = str(subprocess.check_output([android,'create', 'avd', '-n', emulator_name, '-t', target_id, '-b', abi],stdin=PIPE)) 
emulator_create.communicate("n") 

を試してみましたが、それは次のようなエラー

raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command '['/home/fahim/Android/Sdk/tools/android', 'create', 'avd', '-n', 'samsung_1', '-t', '5', '-b', 'android-tv/x86']' returned non-zero exit status 1 

Process finished with exit code 1 

を発生させますか?

+1

エラーをキャッチし、例外の 'output'属性をチェックする必要があります。 –

答えて

0

あなたの例では機能しないものがあります。 subprocess.check_output()は、実行する子プロセスの出力を返します。ではなく、がこのプロセスのハンドルになります。つまり、子プロセスを操作するために使用できない文字列オブジェクト(またはバイトオブジェクト)を取得します。

恐らく、subprocess.check_output()を使用しているスクリプトは、子プロセスを実行し、終了するまで待機してから続行することが考えられます。あなたはそれと通信できることはありませんので、しかし、それは標準入力で受け付けるコマンドの例としてgrepを使用して、今すぐsubprocess.CalledProcessError


を発生させますゼロ以外の戻り値で終了します

#!/usr/bin/env python2.7 
import subprocess 

external_command = ['/bin/grep', 'StackOverflow'] 
input_to_send = '''Almost every body uses Facebook 
You can also say that about Google 
But you can find an answer on StackOverflow 
Even if you're an old programmer 
''' 

child_process = subprocess.Popen(args=external_command, 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         universal_newlines=True) 
stdout_from_child, stderr_from_child = child_process.communicate(input_to_send) 
print "Output from child process:", stdout_from_child 
child_process.wait() 

は、それが印刷されます(私は、Android仮想デバイスの作成者がインストールされていないので)あなたがこれを行うことが何かを実行し、「子プロセスからの出力:をしかし、あなたはStackOverflowの上で答えを見つけることができます」で、 grepからの出力。この例では

、私は後に通信することを可能にするために値subprocess.PIPEで引数stdinstdoutを設定し、子プロセスに

  • をハンドルを作成するために、クラスsubprocess.Popenを使用し

    1. を持っていますこのプロセス。
  • 標準入力に文字列を送信するために.communicate()メソッドを使用しました。同じステップで、標準出力と標準エラー出力を取得しました。
  • が(ちょうどので、それが実際に機能していることを示すために)最後のステップで取得し、標準出力を印刷
  • はこの子プロセスはPython 3.5で
  • を終了したことを待っていた、それも簡単です:

    この例では
    #!/usr/bin/env python3.5 
    import subprocess 
    
    external_command = ['/bin/grep', 'StackOverflow'] 
    input_to_send = '''Almost every body uses Facebook 
    You can also say that about Google 
    But you can find an answer on StackOverflow 
    Even if you're an old programmer 
    ''' 
    
    completed_process_result = subprocess.run(args=external_command, 
                  input=input_to_send, 
                  stdout=subprocess.PIPE, 
                  universal_newlines=True) 
    print("Output from child process:", completed_process_result.stdout) 
    

    、私が持っている:モジュールの機能を使用し

    • subprocess.run()コマンドを実行します。
      • input引数は、我々は戻り値は

    今、あなたの子プロセスの出力を盗んために後で使用されている子プロセス

  • の標準入力に送る文字列です。あなたの状況にこのコードを適応させる必要があります。

  • 関連する問題