2013-01-21 114 views
5

我很努力地在python中使用子進程。這是我的任務:在子進程中使用python Popen

  1. 開始通過命令行的API(這應該是不低於運行在命令行上任何參數不同)
  2. 驗證我的API已經上來了。做到這一點的最簡單方法是將標準輪詢出來。
  3. 針對API運行命令。
    1:當我能夠運行一個新的命令
  4. 通過查詢驗證命令完成的標準輸出(API不支持日誌記錄)

什麼我迄今試圖將出現一個命令提示符我在這裏用Popen卡住了。據我所知,如果我使用 subprocess.call("put command here")這個工程。我想嘗試使用類似的東西:

import subprocess 

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

,我使用run_command("insert command here")但什麼都不做。

相對於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