Python 子进程标准输出被环境变量 $COLUMNS 截断
Python subprocess stdout truncated by env variable $COLUMNS
我正在使用子进程在 python (3.4.3) 中调用 bash 脚本:
import subprocess as sp
res = sp.check_output("myscript", shell=True)
和myscript包含一行:
ps -ef | egrep somecommand
它给出的结果与在 bash shell window 中直接调用 myscript 时的结果不同。经过多次修改,我意识到当在 python 中调用 myscript 时,"ps -ef" 的标准输出被 [=43= 的当前 $COLUMNS 值截断了] window 在被传送到 "egrep" 之前。对我来说,这太疯狂了,因为只需调整 shell window 的大小,该命令就可以给出不同的结果!
我设法 "solve" 通过将 env 参数传递给子进程调用以指定足够宽的列来解决问题:
res = sp.check_output("myscript", shell=True, env={'COLUMNS':'100'})
但是,这对我来说看起来很脏,我不明白为什么截断只发生在 python 子进程中,而不发生在 bash shell 中。坦率地说,我很惊讶官方 python 文档中没有记录这种行为,除非它实际上是一个错误——我使用的是 python 3.4.3。避免这种奇怪行为的正确方法是什么?
您应该使用 -ww
,从 man ps
:
-w
Wide output. Use this option twice for unlimited width.
我正在使用子进程在 python (3.4.3) 中调用 bash 脚本:
import subprocess as sp
res = sp.check_output("myscript", shell=True)
和myscript包含一行:
ps -ef | egrep somecommand
它给出的结果与在 bash shell window 中直接调用 myscript 时的结果不同。经过多次修改,我意识到当在 python 中调用 myscript 时,"ps -ef" 的标准输出被 [=43= 的当前 $COLUMNS 值截断了] window 在被传送到 "egrep" 之前。对我来说,这太疯狂了,因为只需调整 shell window 的大小,该命令就可以给出不同的结果!
我设法 "solve" 通过将 env 参数传递给子进程调用以指定足够宽的列来解决问题:
res = sp.check_output("myscript", shell=True, env={'COLUMNS':'100'})
但是,这对我来说看起来很脏,我不明白为什么截断只发生在 python 子进程中,而不发生在 bash shell 中。坦率地说,我很惊讶官方 python 文档中没有记录这种行为,除非它实际上是一个错误——我使用的是 python 3.4.3。避免这种奇怪行为的正确方法是什么?
您应该使用 -ww
,从 man ps
:
-w
Wide output. Use this option twice for unlimited width.