创建 Python 脚本以在 Linux 中打开新终端并运行命令
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 中轻松运行命令。
相关文章
Python Crc32 介绍
发布时间:2023/06/02 浏览次数:182 分类:Python
-
本篇文章将介绍使用 Python 中的 binascii 或 zlib 库计算数据的 crc32。Python CRC32 。CRC32 是数据的校验和,也称为循环冗余校验,用于检查数据的数字传输中存在的错误。
在 Python 中使用 Luhn 算法验证数字
发布时间:2023/06/02 浏览次数:164 分类:Python
-
这篇文章解释了用 Python 编写 Luhn 算法并根据算法验证数字。在 Python 中使用 Luhn 算法验证数字 Luhn 算法验证器有助于检查合法数字并将其与不正确或拼写错误的输入分开。
Python - 匹配多行文本块的正则表达式
发布时间:2023/06/02 浏览次数:192 分类:Python
-
本文讨论了在多行字符串中搜索特定模式的方法。 该解决方案折衷了已知和未知模式的几种方法,并解释了匹配模式的工作原理。编写正则表达式以匹配多行字符串的原因
在 Python 中使用正则表达式捕获组
发布时间:2023/06/02 浏览次数:78 分类:Python
-
本篇文章介绍了如何借助 Python 中的正则表达式捕获组。 我们还将了解这些群体以及我们如何捕获它们。 让我们开始吧。在 Python 中使用正则表达式捕获组
Python 正则表达式转义
发布时间:2023/06/02 浏览次数:64 分类:Python
-
这篇文章是关于 Python 正则表达式转义的。 此外,我们将介绍 Python 正则表达式转义以及如何通过适当的示例代码使用它,以及 Python 正则表达式的多种用途。
在 Python 中使用 Re 模块的正则表达式通配符
发布时间:2023/06/02 浏览次数:51 分类:Python
-
通配符在正则表达式中用作表示或交换一个或多个字符的符号。 这些主要用于简化搜索条件。本文详细解释了如何在 Python 中使用带有通配符的 re.sub() 来匹配字符串与正则表达式。使用 re.sub
在 Python 中为对象添加属性
发布时间:2023/06/02 浏览次数:88 分类:Python
-
我们将介绍如何在 Python 中为对象添加属性。 我们还将通过示例介绍如何在 Python 中更改对象的属性。在 Python 中为对象添加属性 在 Python 中,我们时常使用对象,因为 Python 是一种面向对象的语
Python 中的匿名对象
发布时间:2023/06/02 浏览次数:185 分类:Python
-
本篇文章将介绍在 Python 中创建匿名对象的方法。在 Python 中使用 namedtuple 类创建匿名对象 匿名对象只是一个没有真实名称的值。 因此,它被称为匿名。
Python 中的短路评估
发布时间:2023/06/02 浏览次数:193 分类:Python
-
本文是关于使用逻辑运算符在 Python 中显示短路行为。Python 中的逻辑运算符 or (或)运算符。短路是指当表达式的真值已经确定时终止布尔运算。 Python 解释器以从左到右的方式计算表达式。