echo'ing命令(带回路)进入Popen stdin

时间:2018-03-28 20:28:06

标签: python subprocess

我想在python中运行fdisk函数,但是返回使得这不起作用...

command = ['echo', '-e', "'o\nn\np\n1\n\n\nw'", '|', 'sudo', 'fdisk', '/dev/xvdm']
p = subprocess.Popen(command, stdin=subprocess.PIPE, 
                              stdout=subprocess.PIPE, 
                              stderr=subprocess.PIPE)
output, err = p.communicate()

这给出了(不正确的)输出: b"'o\nn\np\n1\n\n\nw' | sudo fdisk /dev/xvdm\n"

等价物是什么?

2 个答案:

答案 0 :(得分:2)

为什么不运行fdisk并自己发送输入?

command = ['sudo', 'fdisk', '/dev/xvdm']
p = subprocess.Popen(command, stdin=subprocess.PIPE, 
                              stdout=subprocess.PIPE, 
                              stderr=subprocess.PIPE)
output, err = p.communicate(b"o\nn\np\n1\n\n\nw")

答案 1 :(得分:0)

你不能在这样的命令中使用管道(|)。管道作为程序的参数给出(在你的情况下为“echo”)。

scnerd为您提供了将输入文本发送到fdisk的最佳方式/答案。

如果你真的想保留管道,你应该使用参数“-c”(命令)运行一个“bash”程序,并在参数中输入命令(包括你的管道):

command = ['bash', '-c', "echo -e 'o\nn\np\n1\n\n\nw' | sudo fdisk /dev/xvdm"]
p = subprocess.Popen(command, stdin=subprocess.PIPE, 
                     stdout=subprocess.PIPE, 
                     stderr=subprocess.PIPE)
output, err = p.communicate()