【问题标题】:Sending commands to terminal向终端发送命令
【发布时间】:2021-09-22 15:19:55
【问题描述】:

我想将一些命令传送到我的 python 程序打开的 Xterm 窗口中。 我在 Linux 上,正在使用子进程与终端通信

import subprocess

subprocess.run("xterm -e python3 main.py",shell=True)

这将打开一个 xterm 窗口并运行脚本,在我使用子进程模块调用的 main.py 文件中包含以下代码:

import time

while True:
    try:
        print("Me is running")
        time.sleep(5)
    except KeyboardInterrupt:
        print("Stoped:(")
        break

我想给linux终端下命令。

所以如果我在终端上按Ctrl+c,它应该在 xterm 上打印 Stopped:(

【问题讨论】:

  • 你的意思是从父进程传入命令吗?还是手动与子流程交互?
  • 是的,我的意思是通过父进程。 @tripleee

标签: python linux terminal subprocess xterm


【解决方案1】:

我认为使用子进程在 xterm 或 cmd 上运行命令是不可能的。 subprocess 用于直接执行程序。不是来自 cmd 或 xterm。而且 cmd 或 xterm 也不接受任何参数

【讨论】:

  • 这在几个方面令人困惑。 xterm 确实允许您指定要运行的命令,并且在子进程中运行 xterm 非常好(尽管我通常建议不要这样做;很多时候,更好的解决方案是不让 Python 直接干预用户的 GUI )。
【解决方案2】:

xterm 中运行子进程会将您与其输入和输出文件描述符分离。无论如何,run 调用将一直阻塞,直到子进程终止。

更好的解决方案是使用subprocess.Popenpexpect 将子进程作为直接子进程运行。如果您愿意,可以在新的xterm 中运行父级;如果它自己不执行任何 I/O,则看起来子进程完全处于控制之中。

Stack Overflow subprocess tag info page 有几个链接指向有关如何与正在运行的子进程交互的问题。

【讨论】:

  • I/O of its own mean 是什么意思,如果我添加一个参数,如果在父终端上按下 ctrl+c,则 x-term 中的所有文本都必须写入文件。那会是 I/O 吗??
  • 如果父脚本向终端打印某些内容,您无法判断它是由父脚本还是子脚本打印。同样,如果父进程需要读取键盘输入,它就不能(没有子进程的合作)。
  • 那么我该怎么做呢?我已经为此奋斗了好几个小时。我看到了带有子流程标签的问题
  • stackoverflow.com/questions/7897202/… 似乎有几个可行的解决方案。 pexpect 在这里可能有点矫枉过正,但仍然可能是最简单的解决方案。如果您坚持使用subprocess,则可能需要将父进程文件描述符关闭到stdin,以便让子进程接管。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多