2013-02-08 77 views
0

我想通過使用subprocess.Popen的python腳本來格式化硬盤。 在shell中鍵入以下命令可以很好地工作。只要注意這個命令!'parted mklabel'通過Python子進程產生錯誤

parted /dev/sdh mklabel gpt 

Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? 
Yes/No? 

我同意輸入Yes並且磁盤格式良好。

在Python子進程內部滾動它,Popen退出,狀態碼爲1. 我甚至無法在stdin管道中寫入'Yes'。

代碼如下:

#test1 
from subprocess import Popen, PIPE, STDOUT 

p = Popen('parted /dev/sdh mklabel gpt', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 
print p.wait() 

或者,

# test2 
p = Popen('parted /dev/sdh mklabel gpt', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 

p.stdin.write('Yes\n') 

IO錯誤:[錯誤32]破管

我不知道如果POPEN不將此警告視爲錯誤,如果發生這種情況,我怎麼能改變他的行爲? 感謝您的任何建議。

+1

我懷疑parted想要訪問一個實際的終端,而不僅僅是一個管道。您是否嘗試過['pexpect'](http://www.noah.org/wiki/pexpect)? –

+0

p.stdin是一個破損的管道,這是正常的,因爲Popen已經退出了1(見測試1)。爲什麼會發生這種情況,我仍然不明白。將看看pexpect。 – ScotchAndSoda

回答

0

通過向命令添加-s選項(忽略輸出),parted退出成功。

Popen('parted -s /dev/sdh mklabel gpt', shell=True)