如何将管道命令字符串与 Python 子进程模块一起使用?

发布于 2024-11-08 15:54:47 字数 574 浏览 0 评论 0原文

我想在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谜兔 2024-11-15 15:54:47

“包含电池”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.

浮云落日 2024-11-15 15:54:47

您无法将复杂的命令字符串传递给 Popen() 函数。它采用一个列表作为第一个参数。 shlex 模块,特别是 split() 函数,将帮助您很多,并且 subprocess 文档有一些使用它的示例。

所以你想要这样的东西:

import shlex, subprocess
command_line = 'echo -e "n\np\n1\n\n\nw\n" | sudo fdisk /dev/X'
args = shlex.split(command_line)
p = subprocess.Popen(args) # Success!

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:

import shlex, subprocess
command_line = 'echo -e "n\np\n1\n\n\nw\n" | sudo fdisk /dev/X'
args = shlex.split(command_line)
p = subprocess.Popen(args) # Success!
慕烟庭风 2024-11-15 15:54:47

实际上,您必须使用两个管道,第二个管道的输入将是第一个管道的输出,因此要做的事情如下:

 p=subprocess.Popen(['printf','n\np\n1\n\n\nw\n'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 p1=subprocess.Popen(['fdisk','/dev/X'],stdin=p.stdout, stderr=subprocess.PIPE, stdout= subprocess.PIPE).wait()

额外:注意 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:

 p=subprocess.Popen(['printf','n\np\n1\n\n\nw\n'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 p1=subprocess.Popen(['fdisk','/dev/X'],stdin=p.stdout, stderr=subprocess.PIPE, stdout= subprocess.PIPE).wait()

Bonus: notice the wait() , this way your script will wait for the fdisk to finish.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文