Python 回声&x27;将命令(带返回)输入Popen stdin

Python 回声&x27;将命令(带返回)输入Popen stdin,python,subprocess,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,

我想在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”


等价物是什么

为什么不自己运行
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")

为什么不自己运行
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")
不能在这样的命令中使用管道(|)。管道作为程序的参数提供(在您的例子中为“echo”)

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

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

不能在这样的命令中使用管道(|)。管道作为程序的参数提供(在您的例子中为“echo”)

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

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


echo-e'foo'
中的引号供shell使用。当您传递一个显式的argv列表并使用
shell=False
时,没有shell来使用它们,因此它们是文本的。与
|
相同——它是对shell的指令;如果没有外壳,就没有必要遵循该说明。请参阅popen文档中的部分,了解您实际需要管道的情况。也就是说,永远不应该使用
echo-e
——黑色字母POSIX规范的唯一解释是
echo-e
必须在输出时打印
-e
;任何不这样做的shell都是不遵从的。(默认情况下,Bash是不兼容的,但是如果设置了
xpg_echo
posix
选项,则Bash将变得兼容,因此即使您的shell是Bash,对
echo-e
将执行的操作进行假设也是不安全的)。请特别参阅应用程序用法和基本原理部分。
echo-e'foo'
中的引号用于shell的使用。当您传递一个显式的argv列表并使用
shell=False
时,没有shell来使用它们,因此它们是文本的。与
|
相同——它是对shell的指令;如果没有外壳,就没有必要遵循该说明。请参阅popen文档中的部分,了解您实际需要管道的情况。也就是说,永远不应该使用
echo-e
——黑色字母POSIX规范的唯一解释是
echo-e
必须在输出时打印
-e
;任何不这样做的shell都是不遵从的。(默认情况下,Bash是不兼容的,但是如果设置了
xpg_echo
posix
选项,则Bash将变得兼容,因此即使您的shell是Bash,对
echo-e
将执行的操作进行假设也是不安全的)。请特别参阅应用程序用法和基本原理部分。如果您将其从
echo-e
(在输出上打印
-e
以外的任何操作时的一种bash主义)更改为
printf
(标准强制功能),您可以设置
shell=True
,并避免使用
bash-c
。是的好评论。使用shell=True更好,例如:command=[“echo-e'o\nn\np\n1\n\n\nw'| sudo fdisk/dev/xvdm”]p=subprocess.Popen(command,…,shell=True)使用
shell=True
,您的shell是
/bin/sh
,因此
echo-e
不能保证工作。请参阅--
echo
本身的POSIX标准建议,如果在格式字符串中使用反斜杠,则使用
printf
,或
-n
。(
-e
一点也没有提到,因为规范的黑白文本不允许它有任何特殊行为;请参阅顶部标题中的“实现不支持任何选项”;唯一的例外是为
-n
指定的,这使得作为第一个操作数传递时行为未定义)。如果您将其从
echo-e
(在输出时执行打印
-e
以外的任何操作时的bashism)更改为
printf
(标准强制功能),则可以设置
shell=True
,并避免使用
bash-c
。是的,这是一个好的评论。使用shell=True更好,例如:command=[“echo-e'o\nn\np\n1\n\n\nw'| sudo fdisk/dev/xvdm”]p=subprocess.Popen(command,…,shell=True)使用
shell=True
,您的shell是
/bin/sh
,因此
echo-e
不能保证工作。请参阅--
echo
本身的POSIX标准建议,如果在格式字符串中使用反斜杠,则使用
printf
,或
-n
。(
-e
一点也没有提到,因为规范的黑白文本不允许它有任何特殊行为;请参阅顶部标题中的“实现不支持任何选项”;唯一的例外是为
-n
指定的,这使得作为第一个操作数传递时行为未定义)。