【问题标题】:Python subprocess stdout truncated by env variable $COLUMNSPython 子进程标准输出被环境变量 $COLUMNS 截断
【发布时间】: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


【解决方案1】:

你应该使用-ww,来自man ps

-w

宽输出。使用此选项两次以获得无限宽度。

【讨论】:

  • 谢谢,实际上是 ps 根据当前 $COLUMNS 截断了它的输出——为什么直接在 bash shell 窗口中调用它时不截断?
  • 它也发生在 bash 中,尝试:COLUMNS=8 ps -ef 你会看到截断的输出
  • COLUMNS 不是正常导出的,是shell设置的。在交互模式下,它将被设置为正确的大小。请参阅man bash 中的选项setwinsize
  • 不确定我是否理解 - 在我的 bash shell 中,我可以看到 $COLUMNS 在我调整窗口大小时自动更新。但是,在 bash shell 中输入的 ps -ef 似乎没有“看到”这个值,而按照 Diego 的建议明确添加 COLUMNS=8 确实会影响 ps。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2010-11-19
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2015-04-15
相关资源
最近更新 更多