创建 Python 脚本以在 Linux 中打开新终端并运行命令

news2024/11/27 10:27:48

文章目录

    • 创建在 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\"'")

代码有什么作用?

  1. 在第一行代码中导入了 Python 模块 os。 该模块有助于将命令传递给操作系统。
  2. 需要执行的命令行语法存储在名为 My_Cmmnd 的变量中。 此示例中使用的语法检查系统的 Python 版本。
My_Cmmnd="python3 --version"
  1. 第三行代码向系统发送命令。
os.system("gnome-terminal -e 'bash -c \""+My_Cmmnd+";bash\"'")

上面的代码片段执行以下操作:

  1. os.system() 启动子 shell 并执行括号内的命令。
  2. gnome-terminal 命令在 Linux 操作系统中启动一个新的 gnome-terminal。
  3. 变量 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
)

输出:

ls la 命令

当参数传递给 shell 时,此命令作为字符串执行。 结果,shell 在开始执行我们的 subprocess() 时将该字符串解释为命令参数。

上述方法的一个缺点是,当使用 shell=true 显式调用 shell 时,它会将所有元字符(包括空格)传递给子进程,这在 shell 注入事件中构成威胁。

为避免这种情况,请改用 Python 列表。 使用列表时,要调用的命令位于列表的第 0 个索引处,其他参数紧随其后。

将上一个示例中使用的命令调用为列表。

import subprocess

subprocess.run(['ls', '-la'])

输出:

ls la safe 命令

命令的结果也可以通过设置选项 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 中轻松运行命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PB9如何实现datawindow打印导出PDF,PB导出PDF

PB9如何实现datawindow打印导出PDF&#xff0c;PB导出PDF&#xff1f; 之前的saveas导出pdf&#xff0c;设置非常麻烦。需要 1. 安装gs705w32.exe 2. 安装虚拟打印机 Sybase\Shared\PowerBuilder\drivers\ADIST5.INF 手动添加打印机 这个方法现在对于win64不支持。 今天客…

window11 + python3.7+NVDIA11.7 +pytorch GPU 加速环境配置

window11 python3.7NVDIA11.7 pytorchGPU 加速环境配置 关于pytorch配置GPU环境我在网上看了很多&#xff0c;其实现在基本上没有windows 11 版本环境的配置但是其实没必要担心这个&#xff0c;这没有影响。 对于博主呢&#xff0c;其实不太像配置GPU的&#xff0c;因为其实…

【MYSQL篇】一文弄懂mysql索引原理

文章目录 索引是什么&#xff1f;索引定义索引类型 索引存储模型推演二分查找二叉查找树&#xff08; Binary Search Tree&#xff09;平衡二叉树&#xff08;AVL Tree&#xff09;多路平衡查找树&#xff08;B Tree&#xff09;B树&#xff08;加强版B Tree&#xff09; 小结 …

PyQt中数据库的访问(一)

访问数据库的第一步是确保ODBC数据源配置成功&#xff0c;我接下来会写数据源配置的文章&#xff0c;请继续关注本栏&#xff01; &#xff08;一&#xff09;数据库连接 self.DBQSqlDatabase.addDatabase("QODBC") self.DB.setDatabaseName("Driver{sqlServer…

shell 实现子进程多任务,进程高并发

多进程的作用 提高程序的效率&#xff1a;一些CPU密集型的任务&#xff0c;如数据处理、解压、加密等&#xff0c;使用多进程可以提高程序的执行效率&#xff0c;更快地完成计算任务&#xff1b; 实现更复杂的功能&#xff1a;多进程可以在同一时间向不同的方向处理不同的任务…

SpringBoot创建和运行

1、什么是SpringBoot1.1、优点 2、项目创建2.1、使用Idea创建2.2、使用网页创建 3、项目目录介绍4、项目运行5、包路径错误 1、什么是SpringBoot Spring是为了简化Java程序开发的。Spring Boot是一种用于快速构建独立、生产级别的Java应用程序的开源框架&#xff0c;是为了简化…

MySQL优化--undo log和redo log的区别

首先我们需要知道两个概念 缓冲池&#xff08;buffer pool&#xff09;:主内存中的一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删改查操作时&#xff0c;先操作缓冲池中的数据&#xff08;若缓冲池没有数据&#xff0c;则从磁盘加载并缓存…

MySQL数据库基础 13

第十三章 约束 1. 约束(constraint)概述1.1 为什么需要约束1.2 什么是约束1.3 约束的分类 2. 非空约束2.1 作用2.2 关键字2.3 特点2.4 添加非空约束2.5 删除非空约束 3. 唯一性约束3.1 作用3.2 关键字3.3 特点3.4 添加唯一约束3.5 关于复合唯一约束3.5 删除唯一约束 4. PRIMARY…

燃气管网监测系统助力天燃气管道安全运行

随着城市化的进程&#xff0c;燃气管道网络在各个城市中越来越密集&#xff0c;一旦发生燃气泄漏等安全事故&#xff0c;后果将不堪设想。因此&#xff0c;城市燃气管网的建设发展有赖于制定一个安全可靠的监控方案&#xff0c;以保障供气管道与用户安全。物联网技术的发展为城…

北邮国院物联网RFID课程笔记

PDF 获取&#xff1a;微信公众号&#xff1a;灰海宽松&#xff0c;后台回复 “RFID” 获取。 文章目录 RFID1. IntroductionComparison of different automatic identification technologiesThe main features of RFIDConstraints of RFID technologyCore technologies of RFI…

一个cad绘图图型的过程

cad绘图步骤 &#xff1a; 1.设置绘图环境。 选择菜单栏中的“格式”→“图层”命令&#xff0c;新建 3 个图层&#xff1a; 第一图层命名为“粗实线”&#xff0c;线宽为 0.3mm&#xff0c;其余属性默认。 第二图层命名为“细实线”&#xff0c;线宽为 0.15mm&#xff0c;其…

计算机网络开荒5-数据链路层

文章目录 一、 数据链路层服务二、链路层具体实现三、差错检测3.1 差错编码3.2 奇偶校验吗3.3 Internet校验和checksum3.4 循环冗余校验码CRC 四、多路访问控制MAC协议4.1 理想的MAC协议4.2 MAC协议分类4.2.1 TDMA4.2.2 FDMA 4.3 随机访问控制协议4.3.1 时隙ALOHA协议4.3.2 ALO…

chatgpt赋能python:Python拆数指南:如何使用Python快速拆解数字

Python拆数指南&#xff1a;如何使用Python快速拆解数字 如果您正在开发一个关于数字的应用程序&#xff0c;那么您会发现Python可以非常方便地拆解数字。Python的拆数功能可以快速拆解数字并将其转换为可读的形式&#xff0c;这对于数据处理和编程任务来说非常有用。 Python…

JavaScript的数学计算库:decimal.js

An arbitrary-precision Decimal type for JavaScript. 功能 整数和浮点数简单但功能齐全的 API复制 JavaScript 和对象的许多方法Number.prototype Math还处理十六进制、二进制和八进制值比 Java 的 BigDecimal JavaScript 版本更快&#xff0c;更小&#xff0c;也许更容易使…

chatgpt赋能python:Python代码实现查找重复字符串

Python代码实现查找重复字符串 Python 是一种高级程序设计语言&#xff0c;被广泛用于网络编程、web开发、数据分析等领域。在 SEO 操作中&#xff0c;经常需要进行关键词分析&#xff0c;以确定哪些词汇是最重要的。本文将介绍如何使用 Python 实现查找重复字符串的代码。 什…

24连续Hopfield神经网络的优化旅行商问题优化计算(附matlab程序)

1.简述 学习目标&#xff1a; 连续Hopfield神经网络的优化旅行商问题优化计算 需要计算10个城市最优路径及总路径长度 hopfield可以分为离散型神经网络和连续型神经网络&#xff08;DHNN\ CHNN&#xff09; 在之前的文章中讲过的单层感知器和BP都是离散的&#xff0c;目前连续…

高效创作助手:ChatGPT最新版实现批量撰写聚合文章的全新水平

随着人工智能技术的不断发展&#xff0c;ChatGPT最新版作为一款智能创作助手&#xff0c;实现了批量撰写聚合文章的全新水平。它能够在短时间内生成高质量的文章&#xff0c;极大地提高了创作效率。本文将从随机8-20个方面对ChatGPT最新版进行详细的阐述&#xff0c;让我们一起…

C11 std::function 学习

此文&#xff0c; https://blog.csdn.net/bcbobo21cn/article/details/111658249 使用了一次C11 std::function&#xff0c;是作为函数指针使用的&#xff1b; 进一步的来说&#xff0c;C11的std::function可以对任何可以调用的目标实体进行调用操作&#xff1b; std::functi…

RFID课程要点总结_5 EPC

5. EPCglobal Standard & protocol Concept of EPC global network EPCglobal Network: a technology that allows trading partners to document and determine the location of individual goodsif possible in real timeadditional information: such as 生产使用日期…

golang代码规范之框架搭建规范

编写本规范的目的在于&#xff0c;让开发者更方便快捷地搭建项目框架&#xff0c;同时让团队内部的技术栈达到统一。 指导思想 框架搭建需要适应项目的变化&#xff0c;为项目选择最合适的架构&#xff0c;没有什么是一成不变的。技术架构应该是不断完善的&#xff0c;在满足当…