【发布时间】:2016-07-09 18:21:16
【问题描述】:
我正在使用子进程在 python (3.4.3) 中调用 bash 脚本:
import subprocess as sp
res = sp.check_output("myscript", shell=True)
而 myscript 包含一行:
ps -ef | egrep somecommand
它给出的结果与在 bash shell 窗口中直接调用 myscript 时的结果不同。经过多次修改,我意识到当 myscript 在 python 中被调用时,“ps -ef”的标准输出在被传送到“egrep”之前被 shell 窗口的当前 $COLUMNS 值截断。对我来说,这简直太疯狂了,只需调整 shell 窗口的大小,命令就可以给出不同的结果!
我设法通过将 env 参数传递给子进程调用以指定足够宽的 COLUMNS 来“解决”问题:
res = sp.check_output("myscript", shell=True, env={'COLUMNS':'100'})
但是,这对我来说看起来很脏,我不明白为什么截断只发生在 python 子进程中而不发生在 bash shell 中。坦率地说,我很惊讶官方 python 文档中没有记录这种行为,除非它实际上是一个错误——我使用的是 python 3.4.3。避免这种奇怪行为的正确方法是什么?
【问题讨论】:
-
不相关:要保留其他环境变量,您可以使用
env=dict(os.environ, COLUMNS='100')而不是env={'COLUMNS':'100'}
标签: python bash subprocess