python subprocess.run() subprocess.Popen()(执行系统命令、启动新的进程、连接到子进程的输入/输出管道)

news2024/12/28 5:18:10

文章目录

    • python subprocess
    • 基本函数
    • subprocess.run
    • subprocess.Popen
      • subprocess.Popen参数解释
        • - `args`:要执行的命令及其参数。可以是一个字符串或一个字符串列表。
        • - `bufsize`:指定缓冲区的大小。默认值为-1,表示使用系统默认的缓冲区大小。
        • - `executable`:指定要执行的可执行文件的路径。默认值为None,表示使用系统默认的可执行文件。
        • - `stdin`:指定子进程的标准输入。可以是一个文件对象或一个文件描述符。默认值为None,表示使用父进程的标准输入。
        • - `stdout`:指定子进程的标准输出。可以是一个文件对象或一个文件描述符。默认值为None,表示使用父进程的标准输出。
        • - `stderr`:指定子进程的标准错误输出。可以是一个文件对象或一个文件描述符。默认值为None,表示使用父进程的标准错误输出。
        • - `preexec_fn`:在子进程执行前调用的可调用对象。默认值为None,表示不调用任何函数。
          • 示例:使用preexec_fn来将Popen对象绑定进程组
        • - `close_fds`:指定是否在子进程中关闭父进程中打开的文件描述符。默认值为True,表示关闭文件描述符。
        • - `shell`:指定是否通过shell来执行命令。默认值为False,表示不通过shell执行命令。
          • 使用shell执行和不使用shell执行的差异(以管道为例)
        • - `cwd`:指定子进程的当前工作目录。默认值为None,表示使用父进程的当前工作目录。
        • - `env`:指定子进程的环境变量。可以是一个字典,表示环境变量的键值对。默认值为None,表示使用父进程的环境变量。
        • - `universal_newlines`:指定是否将输入/输出流以文本模式打开。默认值为False,表示以二进制模式打开。
        • - `startupinfo`:指定子进程的启动信息。可以是一个subprocess.STARTUPINFO对象,用于设置子进程的一些属性。默认值为None。
        • - `creationflags`:指定子进程的创建标志。默认值为0,表示使用默认的创建标志。
        • - `restore_signals`:指定是否在子进程中恢复信号处理程序。默认值为True,表示恢复信号处理程序。
        • - `start_new_session`:指定是否在新的会话中启动子进程。默认值为False,表示在当前会话中启动子进程。
        • - `pass_fds`:指定要传递给子进程的文件描述符列表。默认值为(),表示不传递文件描述符。
        • - `encoding`:指定输入/输出的编码方式。默认值为None,表示使用系统默认的编码方式。
        • - `errors`:指定输入/输出的错误处理方式。默认值为None,表示使用系统默认的错误处理方式。
        • 总结
      • Popen对象的常用方法和属性

在这里插入图片描述

python subprocess

Python的subprocess模块是用于创建和管理子进程的模块。它提供了一种在Python中调用外部命令的方式,可以执行系统命令、启动新的进程、连接到子进程的输入/输出管道等。

基本函数

subprocess.run

subprocess.run(args, *, stdin=None, input=None, stdout=None,
               stderr=None, capture_output=False, text=None,
               check=False, timeout=None, encoding=None, errors=None)
  • 运行指定的命令,并等待其完成。args参数是一个字符串或列表,表示要执行的命令和参数。
  • stdin、stdout和stderr参数分别用于指定子进程的标准输入、标准输出和标准错误输出的处理方式。
  • capture_output参数用于指定是否捕获子进程的输出。
  • check参数用于指定是否检查子进程的返回值,如果返回值不为0,则会抛出CalledProcessError异常。
  • timeout参数用于指定子进程的超时时间。
  • encoding和errors参数用于指定输入/输出的编码方式和错误处理方式。

subprocess.Popen

subprocess.Popen(args, bufsize=-1, executable=None, 
                 stdin=None, stdout=None, stderr=None, 
                 preexec_fn=None, close_fds=True, 
                 shell=False, cwd=None, env=None, 
                 universal_newlines=False, startupinfo=None, 
                 creationflags=0, restore_signals=True, 
                 start_new_session=False, pass_fds=(), *, 
                 encoding=None, errors=None)
  • 启动一个新的进程,并返回一个Popen对象,可以用于与子进程进行交互。
  • args参数和其他参数的含义与subprocess.run()函数相同。

subprocess.Popen参数解释

- args:要执行的命令及其参数。可以是一个字符串或一个字符串列表。

- bufsize:指定缓冲区的大小。默认值为-1,表示使用系统默认的缓冲区大小。

- executable:指定要执行的可执行文件的路径。默认值为None,表示使用系统默认的可执行文件。

- stdin:指定子进程的标准输入。可以是一个文件对象或一个文件描述符。默认值为None,表示使用父进程的标准输入。

- stdout:指定子进程的标准输出。可以是一个文件对象或一个文件描述符。默认值为None,表示使用父进程的标准输出。

- stderr:指定子进程的标准错误输出。可以是一个文件对象或一个文件描述符。默认值为None,表示使用父进程的标准错误输出。

- preexec_fn:在子进程执行前调用的可调用对象。默认值为None,表示不调用任何函数。

示例:使用preexec_fn来将Popen对象绑定进程组

当使用shell=True时,subprocess.Popen()函数创建的子进程实际上是一个shell进程,而不是直接执行的命令。因此,向Popen对象发送信号并不能直接影响到子进程。

如果需要向通过shell执行的命令发送信号,可以使用os.killpg()函数来发送信号给进程组。具体步骤如下:

  1. 创建Popen对象时,设置preexec_fn=os.setsid,以创建一个新的进程组。
  2. 使用os.killpg()函数发送信号给进程组。

下面是一个示例,演示了如何向通过shell执行的命令发送信号:

import subprocess
import os
import signal

# 通过shell执行命令
process = subprocess.Popen('sleep 10', shell=True, preexec_fn=os.setsid)

# 发送信号给进程组
os.killpg(os.getpgid(process.pid), signal.SIGTERM)

在这个示例中,首先通过subprocess.Popen()函数创建了一个通过shell执行的命令。在创建Popen对象时,通过preexec_fn=os.setsid设置了preexec_fn参数,以创建一个新的进程组。

然后,使用os.killpg()函数发送信号给进程组。在这个示例中,发送了SIGTERM信号,即终止信号。

需要注意的是,向进程组发送信号会影响到进程组中的所有进程。因此,如果有多个通过shell执行的命令,它们都属于同一个进程组,发送信号时需要注意。

- close_fds:指定是否在子进程中关闭父进程中打开的文件描述符。默认值为True,表示关闭文件描述符。

- shell:指定是否通过shell来执行命令。默认值为False,表示不通过shell执行命令。

shell参数设置为True时,表示通过shell来执行命令。这意味着可以使用shell的语法和功能,比如管道、重定向、通配符等。在这种情况下,args参数可以是一个字符串,表示要执行的完整命令。

shell参数设置为False时,表示不通过shell来执行命令。这是默认的行为。在这种情况下,args参数应该是一个字符串列表,其中第一个元素是要执行的命令,后续元素是命令的参数。

需要注意的是,使用shell=True时,应该谨慎处理输入参数,避免命令注入等安全问题。应该始终对用户输入进行验证和过滤,避免直接将用户输入拼接到命令中。

下面是一个示例,演示了shell参数的用法:

import subprocess

# 通过shell执行命令
subprocess.Popen('ls -l', shell=True)

# 不通过shell执行命令
subprocess.Popen(['ls', '-l'])

在这个示例中,第一个Popen()函数调用通过shell执行了ls -l命令,而第二个Popen()函数调用不通过shell执行了ls -l命令。

使用shell执行和不使用shell执行的差异(以管道为例)
  • 使用shell执行:

下面是一个示例,演示了如何通过shell执行命令并使用管道:

import subprocess

# 通过shell执行命令并使用管道
process = subprocess.Popen('ls -l | grep .txt', shell=True)

# 等待子进程结束
process.wait()

在这个示例中,通过subprocess.Popen()函数的shell参数设置为True,表示通过shell执行命令。然后,可以使用shell的管道语法|将两个命令连接起来,实现输出过滤。

  • 不使用shell执行:
import subprocess

# 不通过shell执行命令并使用管道
command1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
command2 = subprocess.Popen(['grep', '.txt'], stdin=command1.stdout, stdout=subprocess.PIPE)

# 获取命令2的输出
output = command2.communicate()[0]

# 打印输出结果
print(output.decode())

在这个示例中,首先创建了两个Popen()对象,分别对应两个命令。command1执行了ls -l命令,并将输出通过管道传递给command2command2执行了grep .txt命令,并将结果输出到标准输出。

通过command2.communicate()方法获取命令2的输出,并将其打印出来。

不通过shell执行命令时,需要手动设置命令之间的输入输出关系,以及处理命令的输出。这需要更多的代码来实现,但也提供了更多的灵活性和控制能力。

- cwd:指定子进程的当前工作目录。默认值为None,表示使用父进程的当前工作目录。

- env:指定子进程的环境变量。可以是一个字典,表示环境变量的键值对。默认值为None,表示使用父进程的环境变量。

- universal_newlines:指定是否将输入/输出流以文本模式打开。默认值为False,表示以二进制模式打开。

- startupinfo:指定子进程的启动信息。可以是一个subprocess.STARTUPINFO对象,用于设置子进程的一些属性。默认值为None。

- creationflags:指定子进程的创建标志。默认值为0,表示使用默认的创建标志。

- restore_signals:指定是否在子进程中恢复信号处理程序。默认值为True,表示恢复信号处理程序。

- start_new_session:指定是否在新的会话中启动子进程。默认值为False,表示在当前会话中启动子进程。

- pass_fds:指定要传递给子进程的文件描述符列表。默认值为(),表示不传递文件描述符。

- encoding:指定输入/输出的编码方式。默认值为None,表示使用系统默认的编码方式。

- errors:指定输入/输出的错误处理方式。默认值为None,表示使用系统默认的错误处理方式。

总结

subprocess.Popen()函数会返回一个Popen对象,可以用于与子进程进行交互。Popen对象具有一些常用的方法和属性,比如communicate()wait()poll()terminate()kill()stdoutstderrreturncode等。

Popen对象的常用方法和属性

  • communicate(input=None, timeout=None):与子进程进行交互,发送输入并获取输出。
  • wait():等待子进程结束,并返回其返回值。
  • poll():检查子进程是否结束,如果结束则返回其返回值,否则返回None。
  • terminate():终止子进程。
  • kill():杀死子进程。
  • stdout:子进程的标准输出。
  • stderr:子进程的标准错误输出。
  • returncode:子进程的返回值。

下面是一个使用subprocess模块的示例,演示了如何执行一个系统命令并获取其输出:

import subprocess

# 执行系统命令
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# 获取命令的输出
output = result.stdout
print(output)

以上代码会执行ls -l命令,并将其输出打印出来。

需要注意的是,subprocess模块在执行外部命令时,存在一定的安全风险,特别是在使用shell=True参数时。因此,在使用subprocess模块时,应该谨慎处理输入参数,避免命令注入等安全问题。

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

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

相关文章

Redis基本全局命令(含key过期策略)

Redis基本全局命令 KEYEXISTSDELEXPIRETTLRedis的key过期策略TYPE KEY 返回所有满⾜样式(pattern)的key。⽀持如下统配样式。 h?llo 匹配 hello , hallo 和 hxlloh*llo 匹配 hllo 和 heeeelloh[ae]llo 匹配 hello 和 hallo 但不匹配 hilloh[^e]llo 匹配…

opencv-图像处理基础-二值图像

opencv学习01_图像处理基础_二值图像 1.二值图像 二值图像是指仅仅包含黑色和白色两种颜色的图像。 在计算机中,通过一个栅格状排列的数据集(矩阵)来表示和处理图像。例如,图 2-1 是 一个字母 A 的图像,计算…

【优选算法题练习】day4

文章目录 一、3. 无重复字符的最长子串1.题目简介2.解题思路3.代码4.运行结果 二、1004. 最大连续1的个数 III1.题目简介2.解题思路3.代码4.运行结果 三、1658. 将 x 减到 0 的最小操作数1.题目简介2.解题思路3.代码4.运行结果 总结 一、3. 无重复字符的最长子串 1.题目简介 …

Java设计模式之结构型-代理模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 1、静态代理类图 2、动态代理类图 三、角色设计 四、案例分析 1、静态代理 2、JDK动态代理 3、Cglib动态代理 五、总结 一、基础概念 代理模式是一种结构型设计模式,它用一个代理对象来封装一个目标对象,通常…

Java的运算符

运算符介绍 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 运算符介绍 算术运算符赋值运算符关系运算符 [比较运算符]逻辑运算符位运算符 [需要二进制基础]三元运算符 算术运算符 介绍 算术运算符是对数值类型的变量进行运算的,在 Ja…

学习记录——Transformer、ViT、Swin-Transformer、SegFormer、TopFormer、Seaformer

Transformer 2017 Computation and Language Google Self-Attention、Multi-Head Attention 位置编码 原理参考链接 ransformer网络结构: ViT 2020 ICLR 将transformer引入到cv领域 将输入图片224x224x3按照16x16x3大小的Patch进行划分,接着通过…

JAVA+Selenium最简单的处理登录弹窗的方式

在做自动化测试遇到需要处理登录弹窗情况,例如我的用户名为admin, 密码为admin, 那么想要登录http://10.10.168.1, 只需要使用以下链接访问即可立即登录, 并免除弹窗: http://账号:密码网址

sys V 进程间通信之共享内存

note 1.使用shmget将在内核创建一个共享内存区 2.使用shmctl才可以删除内核创建的共享内存区 3.使用shmat给当前进程开辟与内核共享内存对应的内存区p&#xff0c;用户态对p的操作会作用到内核共享内存区 code #include <stdio.h> #include <stdlib.h> #inclu…

ROS:Rviz中控制机器人模型运动

目录 一、Arbotix简介二、安装 Arbotix二、Arbotix使用案例2.1需求2.2流程2.2.1创建新功能包&#xff0c;准备机器人 urdf、xacro 文件2.2.2添加 Arbotix 配置文件2.2.3编写 launch 文件配置 Arbotix2.2.4启动 launch 文件并控制机器人模型运动 一、Arbotix简介 Arbotix 是一款…

Python 标签(便签贴)打印,直接连接打印机打印

前言&#xff1a;一开始试了好多打印方式&#xff0c;图片打印很糊&#xff0c;docx文件打印效果最好&#xff0c;但是每次打印会打开Word 影响效率&#xff0c;PDF也会打开PDF软件&#xff0c;打印效果略差于docx文件&#xff0c;TXT文件又不能设置字体&#xff0c;找了好久&a…

8 Surprising Things You Can Do With ChatGPT 你可以用 ChatGPT 做的 8 件令人惊讶的事情

If you’ve heard about ChatGPT and think it’s just a fancy chatbot, you might be underestimating the range of what it can do. Here are some surprising things you can do with ChatGPT, whether you want to write a resume or have it dungeon-master an epic rol…

第二章(二):Django框架Model之ORM操作数据库:增、删、改、查

系列文章目录 备注&#xff1a;这里是Django系列文章的所有文章的目录 第一章(一) : Django框架之创建项目/应用/templates、连接MYSQL、配置日志LOGGING、启动django项目 第一章(二)&#xff1a;Django框架的模式、路由、视图&#xff1b; 第一章(三)&#xff1a;Django框架的…

Linux14.文件(下)

文件描述符fd&#xff0c;分配到的是从0开始最小的没有被占用的。 2.输出重定向(重定向的本质&#xff0c;就是在操作系统内部更改fd对应的内容的指向)&#xff0c;同时理解输入重定向和追加重定向。 3.重定向函数dup2(oldfd, newfd)&#xff0c;oldfd -> newfd (小技巧:一…

jennkins配置k8s动态slave

一、 首先完成jenkins的部署可参考jenkins部署 二、 如果是在同一个k8s集群下部署的则直接这样配置 在security中agent的端口也配置成50000 如果是虚拟机中部署的jenkins添加k8s需要做如下操作 echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt &#…

数字化转型中,企业如何做系统设计

随着人工智能、大数据、云计算、区块链等新一代信息化、数字化技术的高速发展&#xff0c;现阶段社会的方方面面都已经有了巨大的改变&#xff0c;各行各业的企业也都开始了新一轮的科技革命和产业革命&#xff0c;可以说是互联网时代之后&#xff0c;又一个能够从各方面影响世…

MySQL物理文件----日志文件(错误日志、通用查询日志、二进制日志、慢查询日志)

文章目录 MYSQL5.7/8.0支持的几种日志文件1、错误日志&#xff08;Error log&#xff09;2、一般或通用查询日志&#xff08;General query log&#xff09;3、二进制日志&#xff08;Binary log&#xff09;3、1 查看是否开启二进制日志3、2二进制日志开启3、3查看二进制文件位…

数据结构05:树与二叉树[C++][并查集]

图源&#xff1a;文心一言 Chat GPT生成&#xff0c;代码的核心思想与王道咸鱼老师的视频虽然类似&#xff0c;但是在具体实现上毕竟还是略有差别~~因此&#xff0c;如果对考研方向的并查集代码感兴趣&#xff0c;可以查看—— 王道咸鱼老师的视频&#xff1a;{5.5_2_并查集_…

会议邀请|思腾合力邀您共赴MICS 2023第十届医学图像计算青年研讨会

医学图像计算青年研讨会 (Medical Imaging Computing Seminar, MICS) 于2014年成立&#xff0c;宗旨是为医学影像分析领域的全球华人学者提供学术交流平台&#xff0c;增进本领域科研人员和医学专家的交流和合作。 第十届医学图像计算青年研讨会 (MICS 2023) 将于2023年7月14-1…

form表单禁止浏览器自动填充密码

因为用户修改密码的时候,谷歌浏览器、edge等浏览器,总是自动将保存的密码填充到重置密码输入框中,给用户使用带来困扰。原因是因为你在登录的时候选择记住了账号和密码了,所以就会把信息存在浏览器里面,当你在修改密码的时候,由于form表单的 type="password" 所…

【Arduino小车实践】PID算法简介

一、介绍 1. 特点 流量稳定、改变流量&#xff08;水阀&#xff09;&#xff1a;测量当前流量&#xff0c;与预期流量进行比对&#xff0c;不相等则进行相应的调整。 2. 适用系统 适用线性系统&#xff08;二阶以内的线性系统&#xff09;&#xff1a;齐次性、叠加性 3. 宏…