你想要在一个总的 main.py 中,在启动的时候,一步一步启动多个 python 脚本/进程,免去手动一个一个命令行地启动 python 程序的麻烦。
使用 xterm 终端来运行程序是个不错的方案。
为了澄清,我在本文直接指定/指明是使用 Ubuntu 发行版。
避免使用 LINUX 这一过于 Common 的说法,却因为个人没有在其它发行版上试验,可能会哪里存在着细微的区别导致现象不同而没有指出。
所以如果你在参考这篇文章,确保你使用的是同我一样的 Ubuntu 系统,并且预期如果版本不同,可能有一些细微的区别可以自己解决。
如果使用的是不同的发行版系统,则请悉知部分命令可能需要更换相应版本。
在 Ubuntu 桌面上的终端(Terminal)中运行
$ xterm -hold -e 'ls /tmp'
你将会看到桌面上启动了一个 xterm 终端窗口,并且执行了 ls /tmp
命令。
因为使用了 -hold
参数,所以该终端窗口不会在命令执行完成之后自动关闭。需要手动点击 ‘X’ 关闭。
同时你可能会注意到执行
xterm -hold -e 'ls /tmp'
这个命令的终端窗口发生了阻塞现象,只有当手动关闭了调用的 xterm 窗口之后,才会结束该行命令。下文会说明不阻塞的方式。
使用 -e
选项在启动 xterm 窗口后立即执行后面跟随的命令:
$ xterm -e 'apt list'
因为大部分命令执行/产生结果速度很快,所以甚至看不到窗口就退出了,所以这里使用 apt list
这个命令作为示范,该命令会在打开的 xterm 进程中(另一个终端窗口)运行,并且输出,运行结束之后,xterm 自动退出。
这个方式已经在上面说明了,只需要为 xterm 加上 -hold
选项即可。
xterm 本身也是一个程序,我们知道,在 LINUX 终端中,可以为命令行加上 &
使其在后台运行,即:
$ xterm &
这个命令就是将 xterm 视为一个普通的程序运行,而 xterm 是一个终端程序,运行的时候会打开 xterm 终端窗口,加上 &
让 xterm 程序在当前终端的后台运行,就像:
$ gedit &
一样,你懂的,在终端中启动一个编辑器,而非通过点击桌面图标启动,加上 &
使当前终端启动编辑后,使它进入后台继续运行,我们可以继续控制当前的终端。
加入前面示范过的参数,如 $ xterm -hold -e 'sudo apt update' &
就可以指明让启动的 xterm 进程来执行 sudo apt update
命令。运行这个命令,会提示你输入密码,这也就意味着,你通过命令行,而不是点击图标启动了一个新的终端窗口程序,并且同时,借助该程序提供的可选参数 -e
你指定这个程序在启动之后第一件要做的事情就是运行 -e
后面的命令(我们使用两个单引号 '
将命令隔离出来,这样可读性更高一些)。
了解了上面这些内容之后,在 Python 中的使用就显而易见了,我们使用 Python 的 REPL 来演示:
$ python
>>> import os
>>> os.system("xterm -hold -e 'ls /tmp'")
在 Ubuntu 桌面上启动一个 Terminal 运行上面代码,可以看到启动了一个 xterm 程序,并且按预期执行了 -e
后面的命令。
同时,REPL 发生了阻塞,直到我们手动关闭启动的 xterm 程序。
现在,继续实验:
$ python
>>> import os
>>> os.system("xterm -hold -e 'ls /tmp'")
0
>>> os.system("xterm -hold -e 'ls /tmp' &")
0
>>>
这一次我们运行了 os.system("xterm -hold -e 'ls /tmp' &")
可以看到, REPL 没有阻塞,直接返回了 os.system
函数调用结果 0
表示启动 xterm 命令成功
注:当前启动 xterm 的命令执行成功,返回 0;而由 xterm 程序来执行的
-e
后面指定的命令的执行结果成功与否只会体现在 xterm 程序内,和当前启动 xterm 程序的进程无关。
注意,前面文中一再强调 “在 Ubuntu 桌面上的终端(Terminal)中运行…”,也就是说前面的方式不适用与在通过 SSH 链接的终端中运行。如果你需要在 SSH 终端中运行,那么你需要指明 xterm 程序运行时的桌面通过 -display
选项指定。
首先需要在(你想要显示 xterm 窗口的) Ubuntu 桌面上的终端(Terminal)中 运行:
$ echo $DISPLAY
:0
上面给出了结果 :0
(如果是键盘鼠标+屏幕,而非使用远程桌面的话,就是这个结果了)
然后在一个 SSH 窗口中(基本上是你的另一台电脑)运行:
$ xterm -display :0 -e 'apt list' &
[1] <pid>
$
[1] + <pid> done xterm -display :0 -e 'apt list'
这大概是最美好的时刻了,你在你的一台电脑上的终端窗口(可能是 putty/xshell 等等)链接的 SSH 程序中运行了一个命令,然后另外一台电脑的屏幕上打开了一个终端并且哗啦啦地滚动着输出。
That’s It.
将这些用在你的 python 程序中吧,不管你的项目中有几个进程需要启动以执行不同的任务,都可以使用这个方式来一键启动。