Linux 操作系统以其程序员广泛使用的多功能终端而闻名。 但在某些情况下,我们会发现自己重复编写同一组语法,这可能既无聊又耗时。
你有没有想过是否有一种方法可以在文件中预先编写 Linux 命令,然后在终端中立即执行? 是的! 你可以。
您可以在文件中编写预先编写的终端语法,并通过编写 Python 脚本一次性执行。 本文介绍了如何创建一个 Python 脚本来为我们打开一个新的终端并运行一个命令。
在我们开始之前,让我们修改一些基础知识。 Python 脚本在命令行界面中通过定位文件然后运行来执行。 这些文件被执行并显示输出。
有很多方法可以创建 Python 脚本来打开新终端并运行命令。 第一个示例展示了如何创建一个 Python 脚本,该脚本通过 Linux 命令来检查系统内部的 Python 版本。
如果需要在终端直接写命令查看Python版本,使用如下语法:
python3 --version
其中显示系统内部的 Python 版本,如下所示:
jay@jay-virtual-machine:~$ python3 --version
Python 3.10.6
这是命令行语法,这意味着它只能在终端中编写。 如果希望将其作为纯文本写入扩展名为 .py 的文本文件(例如:test.py),则会导致错误。
python3 --version
输出:
jay@jay-virtual-machine:~$ python3 test.py
Traceback (most recent call last):
File "/home/jay/test.py", line 1, in <module>
python3 --version
NameError: name 'python3' is not defined
必须创建一个 Python 脚本,使语法对 Python 编译器和终端都有意义,才能解决这个问题。
要创建 Python 脚本以打开新终端并运行命令,请创建一个扩展名为 .py 的文本文件并编写以下语法:
import os
My_Cmmnd="python3 --version"
os.system("gnome-terminal -e 'bash -c \""+My_Cmmnd+";bash\"'")
代码有什么作用?
My_Cmmnd="python3 --version"
os.system("gnome-terminal -e 'bash -c \""+My_Cmmnd+";bash\"'")
上面的代码片段执行以下操作:
该脚本执行语法并显示所需的输出。
Python 3.10.6
jay@jay-virtual-machine:~$
最后一个示例展示了如何创建一个 Python 脚本来打开一个新终端并通过将命令存储在一个变量中来运行命令。
另一方面,如果语法是单行命令,则可以直接输入而不将其存储在变量中。 创建一个扩展名为 .py 的文件并编写以下语法:
import os
os.system("gnome-terminal -e 'bash -c \"python3 --version\" '")
上面的语法启动一个新的终端并执行命令。 但是使用此方法会在执行命令后立即关闭终端。
解决此问题需要使用以下命令放置一个睡眠计时器:
import os
os.system("gnome-terminal -e 'bash -c \"python3 --version; sleep 5\" '")
上述语法使新终端保持打开状态 5 秒,但可以根据要求增加。 如果终端需要无限期保持活动状态,请使用以下语法。
import os
os.system("gnome-terminal -e 'bash -c \"python3 --version; bash\" '")
这使终端保持打开和活动状态,直到它被用户关闭。
我们学习了如何创建一个 Python 脚本来打开一个新终端并使用 Python 子模块 os 运行命令。 尽管不再推荐使用这个内置库将命令传递到终端。
这是因为 os 在较新版本的 Python 中已被弃用。 为避免安全风险,必须改用Python子模块subprocess。
要创建 Python 脚本以打开新终端并使用子进程运行命令,请创建一个与前面示例类似的扩展名为 .py 的文件,并在其中写入以下代码:
import subprocess
My_Cmmnd = "ls"
process = subprocess.Popen(
"gnome-terminal -e 'bash -c \""+My_Cmmnd+";bash\"'",
stdout=subprocess.PIPE,
stderr=None,
shell=True
)
UNIX 命令 ls 列出当前目录中的文件。 因此,如果运行此命令,则会显示当前目录中的文件列表。
首先导入 subprocess()
模块; 然后,命令存储在一个变量中。 在名为 process 的变量中,参数是为 subprocess()
定义的。
subprocess.Popen 构造函数在读取 gnome-terminal -e 语法时在新的 gnome-terminal 中启动子进程。 最后,Python 脚本打开一个新终端并运行命令。
输出:
jay@jay-virtual-machine:~$ python3 test.py
Desktop Downloads Pictures snap test2.py Videos
Documents Music Public Templates test.py
要了解 Linux shell 提供的一些其他功能,让我们探索使用 subprocess() 将参数发送到 shell。 例如,下面程序中的命令 ls -la 会列出所有元数据和隐藏文件。
import subprocess
My_Cmmnd = "ls -la"
process = subprocess.Popen(
"gnome-terminal -e 'bash -c \""+My_Cmmnd+";bash\"'",
stdout=subprocess.PIPE,
stderr=None,
shell=True
)
输出:
当参数传递给 shell 时,此命令作为字符串执行。 结果,shell 在开始执行我们的 subprocess() 时将该字符串解释为命令参数。
上述方法的一个缺点是,当使用 shell=true 显式调用 shell 时,它会将所有元字符(包括空格)传递给子进程,这在 shell 注入事件中构成威胁。
为避免这种情况,请改用 Python 列表。 使用列表时,要调用的命令位于列表的第 0 个索引处,其他参数紧随其后。
将上一个示例中使用的命令调用为列表。
import subprocess
subprocess.run(['ls', '-la'])
输出:
命令的结果也可以通过设置选项 capture_output=True
存储在变量中。
import subprocess
saved_results = subprocess.run(['ls', '-la'], capture_output=True)
print(saved_results.stdout)
输出:
可以看到输出显示了想要的结果,但是没有索引,文件名散乱。 发生这种情况是因为系统以字节为单位保存了 ls -la 命令的结果。
要获取字符串形式的结果,请设置选项 text=True。
import subprocess
saved_results = subprocess.run(['ls', '-la'], capture_output=True, text=True)
print(saved_results.stdout)
输出:
本文介绍如何创建 Python 脚本以打开新终端并运行命令。 阅读本文的读者将能够创建一个 Python 脚本来打开一个新终端并在 Linux 中轻松运行命令。