抑制从衍生进程到终端的消息[重复]

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 有什么作用?

以上是关于抑制从衍生进程到终端的消息[重复]的主要内容,如果未能解决你的问题,请参考以下文章

自动从终端杀死java进程[重复]

如何在不终止正在运行的 jar 文件进程的情况下关闭终端 [重复]

在终端中使用 mysql 来抑制警告消息,但密码是用 bash 脚本编写的

仅将熊猫值复制到字典:抑制索引 [重复]

发件箱模式 - 我们如何防止消息中继进程生成重复消息?

如何从2行java.util.logging输出中抑制日期行? [重复]