【问题标题】:Terminal window won't stay open when running popen via ssh in Python在 Python 中通过 ssh 运行 popen 时,终端窗口不会保持打开状态
【发布时间】:2026-01-08 22:25:02
【问题描述】:

我正在编写一个在 Linux 服务器上运行的 Python 程序。它根据给定的关键字监视一些日志文件并在 GUI 中显示该日志文件中的行。

我添加了一个新功能,可以打开一个带有“less”的终端窗口,显示用户在我的程序中双击的行。

我的问题是这样的: 当我在本地(在我的计算机上)运行我的程序时,它运行良好。 但是当我通过 SSH 连接到主服务器时从主服务器运行程序时, 程序运行良好,但是当我双击其中一行时,我会看到一个快速打开和关闭的控制台窗口。

这是负责打开“少终端”的代码:

p = subprocess.Popen(args = ["gnome-terminal", "--command = less -p " + "\"" +searchString + "\"" " -j 10 " + "\"" + path + "\""], stdout = subprocess.PIPE) 

我怎样才能让它保持打开状态?

附:如果我添加shell = TRUE,它只会打开一个没有less 结果的新终端窗口。

【问题讨论】:

  • 这不是一个解决方案,但是如果您将&& read 添加到字符串的末尾,您应该能够看到它输出的内容(等待用户输入再继续)

标签: python linux ssh subprocess gnome-terminal


【解决方案1】:

我的问题与 ssh 无关;我设法在我的本地机器上重新创建它。在本地测试程序时,我使用短模式字符串进行测试,但是当我移动到服务器并开始使用实际字符串时,它们太大了!

发生的事情是:我给了less 一个大于 99 个字符的模式。我得到:“ungetcc 溢出”,known bug,随后在less 的 438 版中修复。

【讨论】:

    【解决方案2】:

    对我有用

    if sys.platform != "win32": sp.Popen(command.split(), shell=False)
    else: sp.Popen(command.split(), shell=True)
    

    【讨论】: