2016-02-19 167 views
0

我正在執行從python連接到外部服務器的程序。
如果用戶未通過身份驗證,程序會要求輸入用戶名和密碼。第一行後殺死子進程

下面是子程序輸出的外觀:

Authentication Required 

Enter authorization information for "Web API" 

<username_prompt_here> 
<password_prompt_here> 

我要殺死子「身份驗證要求」在打印後對的,但問題是,我的代碼工作錯誤 - 子是要求憑據後用戶提供它,子進程被終止。

這裏是我的代碼:

with subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True, bufsize=1, universal_newlines=True) as process: 
    for line in process.stdout: 
     if 'Authentication Required' in line: 
      print('No authentication') 
      process.kill() 
     print(line) 

我在做什麼錯?

+0

你能發佈完整的代碼嗎?還是完成?我沒有看到您提示用戶輸入用戶名和密碼的位置。 –

+0

我沒有提示 - 子程序會這樣做(查看attatched輸出)。 – Djent

+0

並且您想在Authentication Required行後立即終止進程? –

回答

1

我在做什麼錯了?

您的代碼就可以了(如果你想後'Authentication Required'線,無論其位置殺子)如果子進程刷新其標準輸出緩衝的時間。見Python: read streaming input from subprocess.communicate()

所觀察到的行爲表明孩子使用塊緩衝模式,因此你的父腳本看到'Authentication Required'線太晚或與process.kill()殺死外殼不殺它的後代(通過命令創建的進程) 。

要解決它:

  • 看你是否能夠通過一個命令行參數,如--line-buffered(由grep接受),強制行緩衝模式
  • 或者看看是否stdbufunbufferscript實用程序在您的情況下工作
  • 或者提供一個僞tty來欺騙流程,使其認爲它直接在終端中運行 - 它也可能強制線路緩衝模式。

見代碼示例:


而且 - 並不總是我要殺了編程的,在第一行之後。只有當第一行是

假設塊緩衝問題是固定的,殺子進程「需要驗證」如果第一行包含Authentication Required

with Popen(shlex.split(command), 
      stdout=PIPE, bufsize=1, universal_newlines=True) as process: 
    first_line = next(process.stdout) 
    if 'Authentication Required' in first_line: 
     process.kill() 
    else: # whatever 
     print(first_line, end='') 
     for line in process.stdout: 
      print(line, end='') 

如果shell=True你的情況需要然後看How to terminate a python subprocess launched with shell=True