使用完后,关闭子流程对象的正确方法是什么?
stdout.close()并
stdin.close()不会终止一个进程 ,除非 它退出本身的输入端或写入错误。
.terminate()并且
.kill()都做工作,以
kill更加一下就POSIX系统“釜底抽薪”,因为
SIGKILL是送的,不能被应用程序忽略。例如,在此博客文章中解释了特定的差异。在Windows上,没有区别。
另外,请记住
.wait()在杀死进程后关闭管道,以免造成僵尸并强制释放资源。
经常遇到的一种特殊情况是从STDIN读取并将其结果写入STDOUT的进程,当遇到EOF时会自行关闭。通过这些程序,通常明智的做法是
subprocess.communicate:
>>> p = Popen(["sort"], stdin=PIPE, stdout=PIPE)>>> p.communicate("4n3n1")('1n3n4n', None)>>> p.returnpre0这也可以用于打印某些内容并在之后立即退出的程序:
>>> p = Popen(["ls", "/home/niklas/test"], stdin=PIPE, stdout=PIPE)>>> p.communicate()('file1nfile2n', None)>>> p.returnpre0考虑到我的脚本的性质,有没有办法只打开一个子流程对象一次,并用不同的shell命令重用它?以任何方式比每次打开新的子流程对象更有效率吗?
我认为该
subprocess模块不支持此功能,也看不到可以在此处共享哪些资源,因此我认为它不会给您带来明显的优势。



