抑制从衍生进程到终端的消息[重复]
Posted
技术标签:
【中文标题】抑制从衍生进程到终端的消息[重复]【英文标题】:Suppressing messages to terminal from spawned process [duplicate] 【发布时间】:2015-10-14 09:31:15 【问题描述】:我有一个看起来像这样的命令
subprocess.Popen('shp2pgsql -s 17932 \\storage1\dev1\gis\a.shp asmithe.myTable | psql -U asmithe -h example.org -d inventory -q', shell=True).wait()
我知道令人发指。它输出到屏幕上,我不希望这样。我该如何压制它? psql
具有用于安静的 -q
选项,但找不到与 shp2pgsql
类似的任何东西
【问题讨论】:
你的意思是this?或者可能只是将该调用分配给一个临时变量? 相关:***.com/questions/16771117/… 不相关:1. 使用原始字符串文字,否则'\a'
是单个字符,您的命令根本不应该工作。 2.用check_call()
代替Popen().wait()
【参考方案1】:
最简单的方法是捕获stdout和stderr并将它们发送到DEVNULL
(我使用espeak 4; echo 'bye'
作为测试命令;echo
打印到标准输出和espeak
,嗯,这样说会有未被捕获的输出)
In [14]: p = subprocess.Popen("espeak 4; echo 'bye'", shell=True, \
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).wait()
In [15]: p = subprocess.Popen("espeak 4; echo 'bye'", shell=True).wait()
bye
如果您使用的是 linux/unix 机器,您可以做的另一件事是将所有内容发送到 /dev/null
In [16]: p = subprocess.Popen("echo 'bye' > /dev/null 2>&1", shell=True).wait()
# note: this is bash. Works for me on zsh as well,
# but might not work for other variants of sh
# use command 2> /dev/null if you only want to redirect stderr.
附录:等等,你使用的是管道,第一个命令显然是输出到 stderr
对于你的脚本,如果我要单独使用 linux 命令,我会这样写:
subprocess.Popen('shp2pgsql -s 17932 \\storage1\dev1\gis\a.shp asmithe.myTable 2> /dev/null | '
'psql -U asmithe -h example.org -d inventory -q', shell=True).wait()
#implicit string concat is awesome for breaking up long lines
【讨论】:
结果最好进入记录器。2>&1
中的 2 和 1 有什么作用?以上是关于抑制从衍生进程到终端的消息[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不终止正在运行的 jar 文件进程的情况下关闭终端 [重复]