从生成的进程中抑制到终端的消息

时间:2015-07-23 21:16:17

标签: python postgresql gis popen

我有一个看起来像这样的命令

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

的任何内容

1 个答案:

答案 0 :(得分:0)

最简单的方法是捕获stdout和stderr并将它们发送到DEVNULL

(我使用espeak 4; echo 'bye'作为测试命令; echo打印到stdout和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