2013-01-21 15 views
5

私は、pythonでサブプロセスを使用するのに苦労しています。ここに私の仕事です:サブプロセスPopenを使用するPopen

    は、コマンドライン経由でAPIを起動し
  1. は私のAPIが来ていることを確認します(これは、コマンドライン上の任意の引数を実行しているよりも異なってはなりません)。これを行う最も簡単な方法は、標準をポーリングすることです。
  2. APIに対してコマンドを実行します。
    1:私は、私がこれまで試みられてきたもの(APIロギングをサポートしていません)

ポーリングを経由して、標準のコマンドの完了を確認し、新しいコマンド

  • を実行することができていたときに、コマンドプロンプトが表示されます。私はPopenを使ってここにこだわっています。もし私が subprocess.call("put command here")を使用すると、私は理解します。

    私はrun_command("insert command here")を使用しますが、これは何もしません
    import subprocess 
    
    def run_command(command): 
        p = subprocess.Popen(command, shell=True, 
             stdout=subprocess.PIPE, 
             stderr=subprocess.STDOUT) 
    

    :私はのようなものを使用することを試してみたかったです。 2.に関して

    は、私の答えはここに似ているべきだと思う: Running shell command from Python and capturing the output、 が、私は仕事への1を得ることができないとして、私はまだことを試していません。

  • 答えて

    7

    少なくとも実際にサブプロセスを開始するには、Popenオブジェクトに実際に通信するように指示する必要があります。

    def run_command(command): 
        p = subprocess.Popen(command, shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.STDOUT) 
        return p.communicate() 
    
    6

    あなたは、Pexpectに特にシェルベースのプログラムと対話するように設計されたモジュールを見ることができます。例えば

    scpコマンドを起動すると、あなたが要求したパスワードを待っている:

    child = pexpect.spawn('scp foo [email protected]:.') 
    child.expect ('Password:') 
    child.sendline (mypassword) 
    

    は、Python 3バージョンのPexpect-uを参照してください。

    +2

    AFAICTを追加するだけで、サブプロセスモジュールは実際には最初の入力で実行された後に完了する(関数呼び出しのような)タスクに合わせて調整されます。進行中のもの(例えば、対話型端末ユーティリティの場合)が必要な場合、Pexpectは*確かに*行く方法です。 – TimStaley