2013-10-24 62 views
1
調用時

我有以下方法我使用測試bc unix命令...它需要一個表達式,執行它並採取輸出背面...處理錯誤命令從POPEN

​​

然而,當我傳遞一個錯誤的表達expr,我想正確處理錯誤,所以對於expr未能正確,我可以斷言的測試用例...

#never stops 
print run_test('2/0\n') 

然而,上述表達永遠不會返回... 我想要返回一個值,假例如,會告訴我,表情是無效的,然後當我斷言,

assertTrue(run_test('2/0\n'), False) 

將正常工作......我怎麼能實現呢?

回答

1

發生了什麼事是stderr沒有被正確地重定向。當你在做readline時,你需要通過python提示符下面的命令將stderr重定向到stdout。您需要將其移至您的功能。

def run_test(expr=""): 

     try: 
      process = sp.Popen('bc', 
           stdin=sp.PIPE, 
           stdout=sp.PIPE, 
           stderr=sp.STDOUT) 
      process.stdin.write(expr) 
      result = process.stdout.readline() 
      process.stdin.close() 
      retval = process.wait() 
      return result 
     except Exception, e: 
      print e 


# correct expression, returns '4' 
print run_test('2+2\n') 

print run_test('2/0\n') # now this stops too 

文件說:http://docs.python.org/2/library/subprocess.html 可以作爲標準錯誤參數POPEN,並表示標準誤差應進入同一句柄作爲標準輸出特殊值。

0
  1. 你最好的選擇將是真正做事的蟒蛇一些 程序永遠無法保證返回的東西明智的。

  2. 接下來最好的方法是避免在交互模式下調用程序,但僅在命令行模式下調用 。

  3. 之後,您可以嘗試始終附加您要撥打的程序的退出位置,例如對於bc使用process.stdin.write(expr + "\nquit\n")

  4. 最後一個和最壞的情況是啓動一個定時器,如果表達式在定時器到期之前沒有終止,則會終止進程並給出超時錯誤。