文章目录
- 创建在 Linux 中打开新终端并运行命令的 Python 脚本
- 在 Linux 中创建 Python 脚本来检查 Python 版本
- 使打开的终端保持活动状态并在其中运行命令的 Python 脚本
- 在 Linux 中使用 Python 子模块 subprocess() 将命令传递到新终端
- 总结
Linux 操作系统以其程序员广泛使用的多功能终端而闻名。 但在某些情况下,我们会发现自己重复编写同一组语法,这可能既无聊又耗时。
你有没有想过是否有一种方法可以在文件中预先编写 Linux 命令,然后在终端中立即执行? 是的! 你可以。
您可以在文件中编写预先编写的终端语法,并通过编写 Python 脚本一次性执行。 本文介绍了如何创建一个 Python 脚本来为我们打开一个新的终端并运行一个命令。
创建在 Linux 中打开新终端并运行命令的 Python 脚本
在我们开始之前,让我们修改一些基础知识。 Python 脚本在命令行界面中通过定位文件然后运行来执行。 这些文件被执行并显示输出。
有很多方法可以创建 Python 脚本来打开新终端并运行命令。 第一个示例展示了如何创建一个 Python 脚本,该脚本通过 Linux 命令来检查系统内部的 Python 版本。
在 Linux 中创建 Python 脚本来检查 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\"'")
代码有什么作用?
- 在第一行代码中导入了 Python 模块 os。 该模块有助于将命令传递给操作系统。
- 需要执行的命令行语法存储在名为 My_Cmmnd 的变量中。 此示例中使用的语法检查系统的 Python 版本。
My_Cmmnd="python3 --version"
- 第三行代码向系统发送命令。
os.system("gnome-terminal -e 'bash -c \""+My_Cmmnd+";bash\"'")
上面的代码片段执行以下操作:
- os.system() 启动子 shell 并执行括号内的命令。
- gnome-terminal 命令在 Linux 操作系统中启动一个新的 gnome-terminal。
- 变量 My_Cmmnd 的内容作为 Bash 命令发送到新终端执行。
该脚本执行语法并显示所需的输出。
Python 3.10.6
jay@jay-virtual-machine:~$
使打开的终端保持活动状态并在其中运行命令的 Python 脚本
最后一个示例展示了如何创建一个 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\" '")
这使终端保持打开和活动状态,直到它被用户关闭。
在 Linux 中使用 Python 子模块 subprocess() 将命令传递到新终端
我们学习了如何创建一个 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 中轻松运行命令。