子流程中的两个输入

two inputs within subprocess

我正在尝试在 Linux 上自动化 fdisk 实用程序,以便使用 Python 删除附加磁盘设备(在本例中为 USB /dev/sdb)上的分区 3.

脚本应执行以下命令:

1). sudo fdisk /dev/sdb // 在 /dev/sdb

上执行 fdisk

欢迎使用 fdisk (util-linux 2.29)。 更改只会保留在内存中,直到您决定写入它们。 使用写命令前请小心

命令(求助m):2)。 d /dev/sdb // 尝试删除 /dev/sdb 分区。

分区号(1-4,默认4):3)。 2 //分区号2

到目前为止,这是我的 Python 代码:

proc = subprocess.Popen(["sudo", "fdisk", "/dev/sdb"], stdin=subprocess.PIPE)    
proc.communicate(b'd /dev/sdb')    
proc.communicate(b'2')    

Line1 和 Line2 工作得很好,但是 Line3 给我以下错误:

Welcome to fdisk (util-linux 2.29).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): Partition number (1-4, default 4): Traceback (most recent call last):
File "./testing.py", line 83, in <module>    
proc.communicate(b'2')    
File "/usr/lib/python3.5/subprocess.py", line 786, in communicate    
self._stdin_write(input)   
File "/usr/lib/python3.5/subprocess.py", line 741, in _stdin_write    
self.stdin.write(input)    
ValueError: write to closed file        

是否可以使用子流程来完成此任务而无需用户与程序交互? 任何帮助将不胜感激。谢谢

Proc.communicate() 函数将有效地以 EOF 信号结束字节。因此,您可以将所有命令视为同一个文件的一部分。尝试:

proc.communicate(b'd /dev/sdb\n2')

\n 是您在按下回车键时发送给程序的内容。