Python 回声&x27;将命令(带返回)输入Popen stdin
我想在python中运行一个fdisk函数,但是返回结果使它无法工作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,
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
指定的,这使得作为第一个操作数传递时行为未定义)。