是否可以为终端窗口指定一个唯一的名称以通过 python 运行命令?

是否可以为终端窗口指定一个唯一的名称以通过 python 运行命令?

我必须通过os.system()Python 运行终端代码。两个命令应该分别在两个终端中运行。是否可以为终端窗口指定唯一的名称/ID,以便在其指定的终端窗口中运行每个命令?

答案1

您打开的每个终端都会获得一个唯一编号的文件(确切地说是伪终端从属 (PTS) 设备),/dev/pts/该文件可以识别和寻址。要获取终端窗口的对应文件名,您可以使用例如tty(参见这个答案寻找替代方案;阅读man pts更多内容):

$ tty
/dev/pts/4

例如,您可以使用该文件名将输出重定向到不同的终端窗口,如下所示:

$ echo test >/dev/pts/4  # run anywhere
test                     # printed in terminal window 4

您实际上无法在另一个终端中运行命令,因为运行命令的不是终端,而是通常在终端中运行的 shell。但是,您可以使用重定向模拟在终端窗口中运行的命令的行为,如下所示(摘自Linux伪终端:在另一个终端执行从一个终端发送的字符串):

echo test </dev/pts/4 &>/dev/pts/4

如果你还想显示你运行的命令,我建议编写一个函数(如何在 Bash 脚本中使用 $* 并省略某些输入变量(例如 $1 和 $2)?),例如:

run_in(){
  t=/dev/pts/$1 &&
  echo "${*:2}" >$t &&
  eval "${@:2}" <$t &>$t
}

一行代码:

run_in(){ t=/dev/pts/$1&&echo "${*:2}" >$t&&eval "${@:2}" <$t &>$t;}

使用方式如下:

$ run_in 4 echo test  # run anywhere
$ echo test           # printed in terminal window 4 (if prompt was already there)
test                  # printed in terminal window 4

在这种情况下,唯一未知的是/dev/pts/?你的 Python 程序将使用的数字。获取这些数字的一种可能方法是启动你自己的终端窗口,它会将它们的“数字”输出到一个文件中,然后你可以读取它[參考] . 假设你正在使用gnome-terminal,Python 代码的相关部分可能如下所示[參考]

#!/usr/bin/python
import os
import subprocess

os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'")
my_terminal_1 = subprocess.Popen(["cat", "/tmp/my-app-tty-1"], stdout=subprocess.PIPE).communicate()[0]
command = "echo Test on: $(date) >" + my_terminal_1
print my_terminal_1
print command
os.system(command)

如果它是 Perl 脚本[參考]

#!/usr/bin/perl
os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'");
my $my_terminal_1 = `cat /tmp/my-app-tty-1`;
my $command = "echo Test on: \$\(date\) > $my_terminal_1";
print ("$my_terminal_1");
print ("$command");
os.system("$command");

相关内容