假设我在当前位置有一个目录名为 h33 / ,我想将其删除。在shell中我输入rm -ri h33
,它就会消失。在python中我写道:
import subprocess
proc = subprocess.Popen(['rm','-ri','h33'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.communicate('yes')
如果目录中没有任何文件,这样可以很好地工作!因此,如果我运行相同的linux命令,我必须回答是输入文件夹,是删除我在那里的单个文件,然后是删除目录。所以我写道:
import subprocess
proc = subprocess.Popen(['rm','-ri','h33'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
for i in range(3):
proc.communicate('yes')
......它不起作用!不知道为什么会这样。
rm: descend into directory ‘hr33’? rm: remove regular empty file ‘hr33/blank’? rm: remove directory ‘hr33’? Traceback (most recent call last):
File "multiDel.py", line 6, in <module>
proc.communicate("yes")
File "/usr/lib/python2.7/subprocess.py", line 806, in communicate
return self._communicate(input)
File "/usr/lib/python2.7/subprocess.py", line 1377, in _communicate
self.stdin.flush()
ValueError: I/O operation on closed file
我想要做的主要是能够使用子进程容纳多个输入(我希望这是有意义的)。请帮帮我
答案 0 :(得分:0)
为什么不强制删除目录而不回答任何问题:
import subprocess
proc = subprocess.Popen(['rm','-rf','h33'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
答案 1 :(得分:0)
.communicate()
关闭管道并等待子进程退出,因此您最多可以调用一次。假设rm
只是一个接受输入的交互式程序的示例(否则,请按照评论中的建议使用shutil.rmtree()
或rm -rf
):
from subprocess import Popen, PIPE
proc = Popen(['rm','-ri','h33'], stdin=PIPE)
proc.communicate(b'yes\n' * 3)
或者你可以直接写信给proc.stdin
:
from subprocess import Popen, PIPE
proc = Popen(['rm','-ri','h33'], stdin=PIPE)
for i in range(3):
proc.stdin.write(b'yes\n')
proc.stdin.flush()
proc.communicate() # close pipes, wait for exit
通常,您可能需要pty
, pexpect
modules与子流程进行交互:
import pexpect # $ pip install pexpect
pexpect.run("rm -ri h33", events={r"'\?": "yes\n"}, timeout=30)
它假定每个需要yes
答案的提示以'?
结尾。