2013-02-08 50 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)