【问题标题】:Preventing linewrap when using pexpect / bash使用 pexpect / bash 时防止换行
【发布时间】:2013-05-12 05:40:24
【问题描述】:

执行以下脚本时(简化示例):

#!/usr/bin/env python
import pexpect
spawn = pexpect.spawn('/bin/bash')
with open('/tmp/logfile.log', 'w') as f:
    spawn.logfile_read = f
    spawn.sendline('echo "Hello I am a really long command, in fact I am 100 characters long! Potato Potato Potato....."')
    spawn.sendline('exit')
    spawn.expect(pexpect.EOF)

我在换行时遇到问题,导致日志中出现^M 字符。 pexpect 日志文件现在看起来像这样:

bash-3.2$ echo "Hello I am a really long command, in fact I am 100 characters lo ^Mng! Potato Potato Potato....."
Hello I am a really long command, in fact I am 100 characters long! Potato Potato Potato.....
bash-3.2$ exit
exit

在 80 个字符之后,该行被回车换行,我不希望这样。我尝试了很多不同的方法来禁用换行(使用tput rmam,事先调用stty columns 1000,使用spawn.setwinsize(1000, 1000),设置os.environ['COLUMNS'] = "1000",将各种参数传递给/bin/bash..),我可以似乎没有找到正确的技巧。

在这种情况下如何禁用换行?

【问题讨论】:

    标签: python bash terminal tty pexpect


    【解决方案1】:

    我终于想通了。当我想起 echo 命令是 bash 的内部命令时,为我指明了正确的方向。将命令更改为 /bin/echo 完全改变了行为。这只是解决方案的一部分。

    看到 bash 本身似乎是问题,我通过手册页查看可能是什么原因。然后它击中了我! Bash 使用 readline 支持,不管使用 /bin/echo 还是内部 echo 命令,禁用它确实可以解决您的问题。

    只需将您的生成线更改为spawn = pexpect.spawn('/bin/bash --noediting')

    【讨论】:

    • 我注意到与壳牌初创公司有互动。例如,如果我在 bash 行中包含 --norc,则仅添加 setwinsize 还不够。在批处理环境中,简单地添加 setwinsize 可能并不可靠。
    • 您的代码对我不起作用……确实,spawn.setwinsize(1000, 1000) 是我在原始问题中已经提到的尝试之一。
    • 你的执行环境一定有些不同。 setwinsize 利用信令来获得预期的结果。你从哪里运行你的脚本?
    • 我只是从 bash 执行它
    • 我现在完全改变了我的答案。希望这会有所帮助。
    【解决方案2】:

    我遇到了同样的问题。使用 setwinsize(1000,1000) 对我有用。

    child = pexpect.spawn('ssh %s@%s' % (user, host))
    child.setwinsize(1000,1000)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多