我正在使用subprocess在Python(3.4.3)中调用一个Bash脚本:
import subprocess as sp
res = sp.check_output("myscript", shell=True)
而 myscript 包含以下一行:
ps -ef | egrep somecommand
当在python中调用myscript时,与直接在bash shell窗口中调用myscript不会产生相同的结果。经过多次尝试,我意识到在python中调用myscript时,“ps -ef”的标准输出被当前$COLUMNS值截断,然后被管道传输给“egrep”。对我来说,这很疯狂,因为仅通过调整shell窗口大小,该命令就可以产生不同的结果!通过向子进程调用传递env参数以指定足够宽的COLUMNS,我成功地“解决”了这个问题。
res = sp.check_output("myscript", shell=True, env={'COLUMNS':'100'})
然而,这看起来对我来说非常混乱,我不明白为什么截断只发生在Python子进程中,而不是在bash shell中。坦白地说,我很惊讶官方Python文档没有记录这种行为,除非它实际上是一个bug - 我正在使用Python 3.4.3。避免这种奇怪行为的正确方法是什么?
env=dict(os.environ, COLUMNS='100')
而不是env={'COLUMNS':'100'}
。 - jfs