2010-10-20 86 views
11

在我的代碼,我有一個類似的行:在Python腳本,我怎麼捕捉subprocess.call輸出到文件

rval = subprocess.call(["mkdir",directoryName], shell=True) 

,我可以檢查rval,看它是否是01 ,但如果它是1,我想以文件格式從命令"A subdirectory or file ben already exists."獲得文本,所以如果我想確保文本是相同的,我可以將它與另一個文件進行比較。

是否有可能有這樣一條線,但我知道這是行不通

rval = subprocess.call(["mkdir",directoryName], shell=True) >> filename 

所以不管用命令發生時,該文本在filename抓獲,並rval仍然有回報碼?

+0

所有這些的複製:http://stackoverflow.com/search?q=%5Bpython%5D+subprocess+capture – 2010-10-20 16:04:14

+0

[Capture subprocess output]的可能重複(http://stackoverflow.com/questions/) 2525263 /捕獲-subprocess-output) – 2010-10-20 16:04:28

+0

爲什麼你不使用Python的內置'mkdir()'? – ghostdog74 2010-10-20 16:08:22

回答

12
import subprocess 
f = open(r'c:\temp\temp.txt','w') 
subprocess.call(['dir', r'c:\temp'], shell=True, stdout=f) 
f.close() 
+0

謝謝,這是有效的。 – Dag 2010-10-20 16:32:48

+1

爲什麼在這種情況下你使用'shell = True'的任何原因?因爲我閱讀使用這是一個壞主意(至少在* nix)。 – user225312 2010-10-20 17:41:02

+0

@PulpFiction,原因有二:首先它被包含在原始問題中,其次我使用Windows shell命令進行測試。 – 2010-10-20 17:42:40

12

的子模塊有一個內置的「check_output」功能,這樣做的:

In [11]: result = subprocess.check_output(['pwd']) 

In [12]: print result 
/home/vagrant 
+0

但是,然後你失去退出價值:( – speg 2013-04-25 18:10:30

+1

當我需要兩個,我使用特使包:https://github.com/kennethreitz/envoy – btubbs 2013-04-25 23:28:04

+3

請注意,check_output是唯一可能的自2.7 – Doomsday 2013-09-04 09:51:50

8
import subprocess 

try: 
    result = subprocess.check_output(['dir', r'c:\temp'], shell=True) 
    print result 
except subprocess.CalledProcessError as e: 
    return_code = e.returncode 

你反正需要使用嘗試捕捉,因爲它會拋出異常,如果返回代碼爲非零: )

+1

這將是更簡單的只是使用'除CalledProcessError作爲e:returncode = e.returncode'。 – orodbhen 2015-07-16 13:58:24