子流程

时间:2018-01-09 03:43:50

标签: python-3.x subprocess disk-partitioning

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

该脚本应执行以下命令:

1)。 sudo fdisk / dev / sdb //在/ dev / sdb上执行fdisk

欢迎使用fdisk(util-linux 2.29)。 更改将仅保留在内存中,直到您决定编写它们。 使用write命令前要小心。

命令(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        

是否可以使用子进程来完成此任务,而无需用户与程序进行交互? 任何帮助将受到高度赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

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

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

\n是您点击回车键时发送给程序的内容。