我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python执行外部命令subprocess的使用详解

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python执行外部命令subprocess的使用详解

目录
  • 一、了解subprocess
    • 1、subprocess.run()方法
    • 2、Popen类
  • 二、补充os模块执行外部命令
    • 1、os.system()方法
    • 2、os.popen()用法

一、了解subprocess

  • subeprocess模块是python自带的模块,无需安装,主要用来取代一些就的模块或方法,如os.system、os.spawn*、os.popen、commands.*等。
  • 因此执行外部命令优先使用subprocess模块

1、subprocess.run()方法

subprocess.run()方法是官方推荐的方法,几乎所有的工作都可以用它来完成。
如下是函数源码:


subprocess.run(args,
 *,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
ced=None,
timeout=None,
check=False,
enccoding=None,
error=None)

该函数返回一个CompletedProcess类(有属性传入参数及返回值)的实例,该函数的参数有很多,只需要记住常用的即可

args : 代表需要在操作系统中执行的命令,可以是字符串形式(要求shell=True),也可以是list列表类型
2、* :代表可变参数,一般是列表或者字典类型
3、stdin、stdout、stderr :指定了可执行程序的标准输入、标准输出、标准错误文件句柄
4、shell :代表着程序是否需要在shell上执行,当想使用shell的特性时,设置shell=True,这样就可以使用shell指令的管道、文件名称通配符、环境变量等,不过python也提供了很多类似shell的模块,如glob、fnmatch、os.walk()、os.path.expandvars()、os.path.expanduser()和shutil。
5、check :如果check设置为True,就检查命令的返回值,当返回值为0时,将抛出AclledProcessError的异常
6、timeout :设置超时时间,如果超时则kill掉子进程

使用字符串方式执行shell命令


[root@localhost python]# vim 1.py
#!/bin/env python3
import subprocess
b=subprocess.run("ls -l /ltp | head -2", shell=True) # 执行run方法,并将返回值赋值给b
# total 184980
# -rw-r--r--. 1 root root     10865 May  8 16:21 123.txt

print(b)              # 执行该run函数后返回的CompletedProcess类
# CompletedProcess(args='ls -l /ltp | head -2', returncode=0)

print(b.args)         # 打印出CompletedProcess类的agrs属性值,就是执行的shell命令
# ls -l /ltp | head -2

print(b.returncode)   # 打印命令执行的状态码
# 0

结果展示

[root@localhost python]# ./1.py
total 184980
-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt

CompletedProcess(args='ls -l /ltp | head -2', returncode=0)2

ls -l /ltp | head -2

0

使用列表方式执行

个人感觉方法二不好用,尤其是想要使用管道符号是,很难用


#!/bin/env python3
import subprocess
b = subprocess.run(["ls", "-l", "/ltp"])
print(b)
print(b.args)
print(b.returncode)

执行结果

[root@localhost python]# ./2.py
total 10865
-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
CompletedProcess(args=['ls', '-l', '/ltp'], returncode=0)
['ls', '-l', '/ltp']
0

捕获脚本输出

  •  如果需要采集命令执行的结果,可以传入参数stdout=subprocess.PIPE

[root@localhost python]# cat 3.py
#!/bin/env python3
import subprocess
# 传入stdout=subprocess.PIPE参数即可
b=subprocess.run("ls -l /ltp | head -2", shell=True, stdout=subprocess.PIPE)

print(b.stdout)

结果显示

[root@localhost python]# ./1.py
b'total 184980\n-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt\n'

检测异常

示例1:模拟renturncode值不为0

传入参数check=True,当返回值不为0时,就会抛出异常


[root@localhost python]# cat 1.py
#!/bin/env python3
import subprocess
b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
print(b.returncode)

执行结果:返回了CalledProcessError 类型报错


[root@localhost python]# ./1.py
ls: cannot access /123: No such file or directory
Traceback (most recent call last):
  File "./1.py", line 3, in <module>
    b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 487, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'ls -l /123 | head -2 && exit 1' returned non-zero exit status 1.
# 返回了 CalledProcessError 类型报错

示例2:模拟执行超时

返回 TimeoutExpired 异常


[root@localhost python]# vim 1.py
#!/bin/env python3
import subprocess

b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)

print(b.returncode)

显示结果

[root@localhost python]# ./1.py
Traceback (most recent call last):
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 474, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 939, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 1682, in _communicate
    self._check_timeout(endtime, orig_timeout)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 982, in _check_timeout
    raise TimeoutExpired(self.args, orig_timeout)
subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./1.py", line 3, in <module>
    b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 479, in run
    stderr=stderr)
subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds

2、Popen类

初步认识Popen类

首先来看一下Popen类的构造函数


class Popen(
    args,
    bufsize=0,
    executable=None,
    stdin=None,
    stdout=None,
    stderr=None,
    preexec_fn=None,
    close_fds=False,
    shell=False,
    cwd=None,
    env=None,
    universal_newlines=False,
    startupinfo=None,
    creationflags=0
):

参数 字符串或列表bufsize0 : 无缓冲

参数 字符串或列表
bufsize 0 : 无缓冲
1 : 行缓冲
其他正数值 :缓冲区大小
负数值 :采用默认的系统缓冲(一般是全缓冲)
executable 一般不用,args 字符串或列表 的第一项表示程序名
stdin
stdout
stderr
None : 没有任何重定向 继承父进程
PIPE : 创建管道
文件对象
文件描述符(整数)
stderr也可以设置为stdout
preexec_fn 钩子函数,在fork和exec之间执行
close_fds unix 下执行新进程前是否关闭0/1/2之外的文件
windows 下不继承还是继承父进程的文件描述
shell 若为True的话 :
在unix 下相当于在args前面添加了 “/bin/bash” “-c"
在windows下,相当于添加了"cmd.exe /c”
cwd 设置工作目录
env 设置环境变量
unviersal_newlines 各种换行符统一处理成"\n"
startupinfo windows下传递给CreateProcess的结构体
creationflags windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口

Popen的使用方法

subprocess.Popen([“cat”, “abc.txt”])
2、subprocess.Popen(“cat abc.txt”, shell=True)

上面的第二种其实就相当于:subprocess.Popen(["/bin/bash", “-c”, “cat abc.txt”])

示例:


[root@localhost python]# cat 3.py
#!/bin/env python3
import subprocess
obj = subprocess.Popen("ls -l /ltp",
                       shell=True,
                       stdin=subprocess.PIPE,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE,
                       universal_newlines=True)
error_info = obj.stderr.read()
out_info = obj.stdout.read()
result = out_info + error_info
print(result)

[root@localhost python]# ./3.py
total 184980
-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
-rw-r--r--. 1 root root       802 Apr 21 09:42 ab.sh
drwxr-xr-x. 3 root root       101 Apr  1 18:34 auth
-rw-r--r--. 1 root root   5242880 Mar 18 13:20 bigfile
-rwxrwxrwx. 1 root root      1392 Feb  5 09:24 dingding.sh

Popen类的对象方法

名称 功能
poll() 检查是否结束,设置返回值
wait() 等待结束,设置返回值
communicate() 参数是标准输入,返回标准输出和标准出错
send_signal() 发动信号(主要指linux下有用)
terminate() 终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess()
kill() 杀死进程(unix对应SIGKILL信号),windows下同上
stdin
stdout
stderr
参数中指定PIPE时有用
pid 进程id
returncode 进程返回值

补充:其他方法

subeprocess.call(*args,**kwargs): call()方法调用Popen()执行程序,并且等待它执行完成
2、subpeocess.check_call(*args, **kwargs): 调用上面的call(),如果返回值非零,返回异常
3、subprocess.check_output(*args, **kwargs) : 调用Popen()执行程序,并返回标准输出

二、补充os模块执行外部命令

1、os.system()方法

示例:


[root@localhost python]# cat 4.py
#!/bin/env python3
import os
# 变量ret接收命令执行后的返回值
ret = os.system('ls -l /ltp |head -2')
print("\n执行成功" if ret == 0 else "\n执行失败")

执行结果

[root@localhost python]# ./4.py
total 184980
-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt

执行成功

2、os.popen()用法

与subprocess.Popen()类似,就不写了

补充:subprocess.run()和subprocess.Popen()的执行结果是写入到缓存的,可以执行结束后打印结果,不会实时在终端输出;而os.system()是实时输出到终端界面的;

以上就是Python执行外部命令subprocess的详细内容,更多关于Python执行外部命令的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python执行外部命令subprocess的使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python执行外部命令subprocess的使用详解

目录一、了解subprocess1、subprocess.run()方法2、Popen类二、补充os模块执行外部命令1、os.system()方法2、os.popen()用法一、了解subprocesssubeprocess模块是pytho
2022-06-02

Python实现subprocess执行外部命令

目录一、Python执行外部命令1、subprocess模块简介2、subprocess模块的遍历函数3、subprocess模块的Popen类(PyCharm)4、使用python自动安i装并启动mongodb一、Python执行外部命令
2022-06-03

python 执行外部命令

在Python环境下,执行一条外部命令一般有这么几个:1、os.system(command)或者os.popen(..........)2、wx.Execute(command, syn=wx.EXEC_ASYNC, callback=N
2023-01-31

python 外部命令执行--OS

Python 也可以通过os、subprocess执行外部shell命令对POSIX类型系统进行操作。  os 一个很强大的命令,可以通过os下的一些方法去执行shell命令,并且可以对对象执行完的标准输出、标准输入和标准错误输出进行操作。
2023-01-31

Python 执行Shell 外部命令

1、os.system()此方法执行的外部程序,会将结果直接输出到标准输出。os.system的返回结果为执行shell 的 $? 值。因此请执行没有输出结果的程序时适合使用此方法。如touch 、rm 一个文件等。In [1]: impo
2023-01-31

Python执行外部命令的方法有哪些

这篇文章主要介绍“Python执行外部命令的方法有哪些”,在日常操作中,相信很多人在Python执行外部命令的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python执行外部命令的方法有哪些”的疑
2023-06-16

详解Shell命令的执行顺序

详解Shell命令的执行顺序?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Shell 从标准输入或脚本中读取的每一行称为管道(pipeline);它包含了一个或
2023-06-09

python执行使用shell命令方法分享

1. os.system(shell_command) 直接在终端输出执行结果,返回执行状态0,1 此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显
2022-06-04

详解Python中命令行参数argparse的常用命令

这篇文章主要为大家详细介绍了Python中命令行参数argparse的一些常用命令,文中的示例代码讲解详细,具有一定的学习价值,需要的可以了解一下
2023-01-29

使用Python登录网关设备执行命令

最近发现办公室有一个感测器网关,偶尔会掉线,重启之后,就正常了。手动操作过程如下:#telnet10.212.82.90Trying10.212.82.90...Connectedto10.212.82.90.Escapecharacter
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录