首页 文章

如果我不在subprocess.Popen()中使用stdout = subprocess.PIPE,有什么区别?

提问于
浏览
6

我最近在Python中注意到 subprocess.Popen() 有一个参数:

stdout=None(default)

我也看到人们使用stdout = subprocess.PIPE .

有什么不同?我应该使用哪一个?

另一个问题是,为什么wait()函数不能等到有时完成进程?我用了:

a = sp.Popen(....,shell=True)
a.wait()
a2 = sp.Popen(...,shell=True)
a2.wait()

有时在命令a完成之前执行a2命令 .

2 回答

  • 3

    stdout=None 表示,来自进程的 stdout -handle直接从父进程继承,更简单的说法就是它,它被打印到控制台(同样适用于 stderr ) .

    然后你有 stderr=STDOUT 选项,这会将 stderr 重定向到 stdout ,这意味着 stdoutstderr 的输出被转发到同一个文件句柄 .

    如果设置 stdout=PIPE ,Python会将数据从进程重定向到新的文件句柄,可以通过 p.stdoutp beeing a Popen object)进行访问 . 您可以使用它来捕获进程的输出,或者使用 stdin 来将数据(不断地)发送到 stdin . 但大多数情况下你想使用 p.communicate ,它允许你将数据发送到进程一次(如果你需要),如果进程完成,则返回完整的 stderrstdout

    另一个有趣的事实是,你可以将 file-object 传递给 stdin/stderr/stdout ,例如也是用 open 打开的文件(该对象必须提供 fileno() 方法) .

    你的_2825421问题 . 情况应该不是这样!作为解决方法,您可以使用 p.poll() 来检查进程是否已退出! wait 电话的返回值是多少?

    Furthermore, you should avoid shell=True especially if you pass user-input as first argument,恶意用户可以使用它来利用您的程序!它还启动了一个shell进程,这意味着额外的开销 . 当然,有1%的情况下你真的需要 shell=True ,我不能用你的简约例子判断这一点 .

  • 10
    • stdout=None 表示子进程打印到脚本打印的任何位置

    • stdout=PIPE 表示子进程'stdout被重定向到您应该读取的管道,例如,使用 process.communicate() 一次读取所有内容或使用 process.stdout 对象通过文件/迭代器接口读取

相关问题