【问题标题】:os.system() and subprocess.Popen() kill escape sequences in Pythonos.system() 和 subprocess.Popen() 在 Python 中杀死转义序列
【发布时间】:2017-03-04 18:52:27
【问题描述】:

我使用 libtmux,而 libtmux 使用 subprocess.Popen() 来调用 Tmux 来控制会话、窗口和窗格。要设置窗格标题,Tmux 需要发送一个转义序列。这可以按预期在命令行上运行:

tmux send-keys -t 0 " printf '\033]2;%s\033\\' 'Pane Title'" C-m

当这个命令由 subprocess.Popen() 或 os.system() 发出时——也可能是其他命令,我只测试了这两个——转义序列不会进入 shell。我记录了发送到文件的命令,并且日志文件中的值是正确的,但是当发送时只有这个存在:

printf '2;%s' 'Pane Title'

我已经通过执行以下命令对此进行了测试:

echo "printf '\033]2;%s\033\\' 'Pane Title'" > /tmp/setname

/tmp/setname的内容如上。

最终使用的方法是tmux_cmd,我通过send_keys这样称呼它:

 p.send_keys("printf '\033]2;%s\033\\' '" + names[i] + "'")

其中“p”是窗格对象。请参阅我的帖子here

我的问题是:如何在 Python 中发出带有转义序列的 shell 命令?

【问题讨论】:

  • 你能告诉我们你的python代码吗?
  • 您的转义序列中有错字:] 而不是 [。 FWIW,使用os.systemsubprocess 向KDE konsole 终端发送转义序列没有问题。这是我的测试代码。 import os, subprocesscmd = 'echo "this is \033[32mcoloured\033[0m text"'; os.system(cmd); subprocess.call(cmd, shell=True)。在 Python 2.6 和 3.6 上测试。
  • @PM2Ring 我想看看代码只是为了看看 OP 是否使用了原始前缀(在这种情况下不能使用)
  • @Jean-FrançoisFabre 当然,OP 的代码可能存在其他问题。所以我同意你的评论,这就是我赞成它的原因。 ;)
  • 转义序列是正确的 - 它可以在命令行上运行,请参阅:github.com/tmux/tmux/issues/680 最后使用的方法是 tmux_cmd:github.com/tony/libtmux/blob/master/libtmux/common.py

标签: python tmux


【解决方案1】:

“原始前缀”是我错过的!谢谢Jean-François Fabre

这行得通:

p.send_keys(r"printf '\033]2;%s\033\\' '" + names[i] + "'")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-30
    • 2018-01-11
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2016-03-12
    • 2017-07-27
    • 2011-06-16
    相关资源
    最近更新 更多