在特定的终端窗口中执行命令 - python

时间:2016-07-21 00:02:13

标签: python subprocess

如何使用python在已打开的特定终端窗口中执行命令?

我可以使用python在新终端中执行命令,但我想重用现有的终端。并且有多个终端开放。 该命令应该在特定终端中运行。

例如:

  1. 我在Terminal1开始处理A.
  2. 我杀了进程A.(现在终端1空闲)
  3. 我想重新启动进程A并在Terminal1中显示进程A的日志/输出。
  4. 我正在使用Ubuntu。

    执行此操作的原因:

    • 将特定命令的日志保存在同一终端中。
    • 将多个应用程序的日志分隔到不同的终端。
    • 维护相应终端中特定应用的日志
      (应用程序被杀死并自动启动多次)

1 个答案:

答案 0 :(得分:0)

我的解决方案有点麻烦并且存在安全问题。也许其他人可以发布一个更好的。

要在打开的终端窗口中执行命令,我使用ttyecho参见unix.stackexchange上的 post)。此方法的安全性问题似乎与shell=Truesubprocess.Popen使用subprocess.run类似。

对于选择特定的开放终端,linux命令ps a列出与tty关联的进程并标识tty。我正在使用Debian衍生物,因此我的开放终端显示为具有'pts / n '(伪终端从属)tty的进程,其中 n 是一个区分不同的开放终端实例。例如:

 PID TTY      STAT   TIME COMMAND
 191 tty7     Rsl+   9:12 /usr/lib/xorg/Xorg :0 -seat seat0 -aut /var/run/ligh
1049 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux
1050 ttyS0    Ss+    0:00 /sbin/agetty ==keep-baud 115200,38400,9600,ttyS0 vt22
4254 pts/0    Ss     0:00 bash
4675 pts/1    Ss+    0:00 bash
4876 pts/2    Ss+    0:00 sudo /srv/xxx/main.py
4878 pts/2    S+     0:01 python3 /srv/xxx/main.py
5012 pty/0    R+     0:00 ps a

假设您可以通过终端中已经运行的内容来区分要运行命令的终端,可以使用以下python代码:

import subprocess
r = subprocess.run(['ps', 'a'], stdout=subprocess.PIPE, universal_newlines=True)
try:
    pts = [*(line for line in r.stdout.split('\n') if searchstring in line)][0]=.split(' ')[1][4:]
except IndexError:
    pts = None
if pts:
    r2 = subprocess.run(['sudo', 'ttyecho', '-n', '/dev/pts/' + pts, command])

我在使用python 3.5运行kali(使用xfce4-terminal)的rPi上测试了这个。