如何将管道命令字符串与 Python 子进程模块一起使用?
我想在 Ubuntu 上使用 Python 脚本对新的空白磁盘进行分区。
在 bash 脚本或命令行中,这可以完成这项工作:
$echo -e "n\np\n1\n\n\nw\n" | sudo fdisk /dev/X
其中 X 是有问题的 HDD。
我尝试使用 subprocess 模块将其移植到 Python 脚本中,如下所示:
p = subprocess.Popen(cmdString, stdout=subprocess.PIPE, \
close_fds=False, stderr=subprocess.PIPE,shell=True)
stdoutAndErr = p.communicate()
其中 cmdString
与上面的 "echo -e ..."
字符串相同。
但这不起作用。输出只是 fdisk
打印出命令选项,因此它显然不喜欢我发送的内容。
上述简单的生活方式有什么问题吗?
I want to partition a new, blank disk using a Python script on Ubuntu.
In a bash script or from the command line, this would do the job:
$echo -e "n\np\n1\n\n\nw\n" | sudo fdisk /dev/X
where X is the HDD in question.
I have tried to port this into a Python script using the subprocess module, as follows:
p = subprocess.Popen(cmdString, stdout=subprocess.PIPE, \
close_fds=False, stderr=subprocess.PIPE,shell=True)
stdoutAndErr = p.communicate()
where cmdString
is just the same "echo -e ..."
string above.
This doesn't work though. Output is just fdisk
printing out the command options, so it clearly doesn't like what I am sending it.
What's wrong with the above simple approach to life?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
“包含电池”pipes 模块可能就是您正在寻找的。 Doug Hellman 有一篇很好的文章,介绍了如何使用它来获得你想要的东西。
The 'batteries included' pipes module may be what you are looking for. Doug Hellman has a nice write-up on how to use it to get what you want.
您无法将复杂的命令字符串传递给 Popen() 函数。它采用一个列表作为第一个参数。 shlex 模块,特别是 split() 函数,将帮助您很多,并且 subprocess 文档有一些使用它的示例。
所以你想要这样的东西:
You can't pass a complex command string to the Popen() function. It takes a list as the first argument. The shlex module, particularly the split() function, will help you a lot, and the subprocess documentation has some examples that use it.
So you'd want something like:
实际上,您必须使用两个管道,第二个管道的输入将是第一个管道的输出,因此要做的事情如下:
额外:注意 wait() ,这样您的脚本将等待 fdisk 完成。
You have to use two pipes actually, the input of the second pipe would be the output of the first one, so here's what to do:
Bonus: notice the wait() , this way your script will wait for the fdisk to finish.