Python中Subprocess的不同函数解析

作者:Taosiyu 时间:2022-03-10 05:23:00 

以前我一直用os.system()处理一些系统管理任务,因为我认为那是运行linux命令最简单的方式.
我们能从Python官方文档里读到应该用subprocess 模块来运行系统命令.subprocess模块允许我们创建子进程,连接他们的输入/输出/错误管道,还有获得返回值。
subprocess模块打算来替代几个过时的模块和函数,比如: os.system, os.spawn*, os.popen*, popen2.*命令。
让我们来看一下subprocess 有哪些不同的函数.

subprocess.call()

执行由参数提供的命令.

我们可以用数组作为参数运行命令,也可以用字符串作为参数运行命令(通过设置参数shell=True)

注意,参数shell默认为False

我们用subprocess.call()来做一个统计磁盘的例子:


subprocess.call(['df', '-h'])

下面的例子把shell设置为True


subprocess.call('du -hs $HOME', shell=True)

注意,python官方文档里对参数shell=True陈述了一个警告:


Invoking the system shell with shell=True can be a security hazard if combined
with untrusted input

现在,我们来看看输入与输出

Input and Output

subprocess 模块能阻止输出,当你不关心标准输出的时候是非常方便的.

它也使你通过一种正确的方式管理输入/输出,有条理地整合python脚本中的的shell命令.

Return Codes

通过subprocess.call的返回值你能够判定命令是否执行成功.
每一个进程退出时都会返回一个状态码,你可以根据这个状态码写一些代码。

stdin, stdout and stderr

在使用subprocess 时,有一个微妙的部分是怎么使用管道把命令连接起来.

管道表明一个新的子管道应该被创建.

默认的设置为None,意味着没有重定向发生

标准错误可以指向标准输出,表明子进程的错误信息会被捕获到和标准输出同一个文件.

subprocess.Popen()

subprocess 模块中基本的进程创建和管理由Popen 类来处理.

subprocess.popen是用来替代os.popen的.

我们来做一些真实的例子,subprocess.Popen需要一个数组作为参数:


import subprocess
p = subprocess.Popen(["echo", "hello world"], stdout=subprocess.PIPE)
print p.communicate()
>>>('hello world
', None)

注意,虽然你可以使用 "shell=True",但并不推荐这样的方式.

如果你知道你只用几个有限的函数,比如Popen和PIPE,你可以单单指定这几个函数:


from subprocess import Popen, PIPE
p1 = Popen(["dmesg"], stdout=PIPE)
print p1.communicate()

Popen.communicate()

communicate()函数返回一个tuple(标准输出和错误).

Popen.communicate() 和进程沟通:发送数据到标准输入.从标准输出和错误读取数据直到遇到结束符.等待进程结束.

输入参数应该是一个字符串,以传递给子进程,如果没有数据的话应该是None.

基本上,当你用 communicate()函数的时候意味着你要执行命令了.

用subprocess写Ping程序

我们先问用户地址,然后用ping请求这个地址.


# Import the module
import subprocess

# Ask the user for input
host = raw_input("Enter a host to ping: ")  

# Set up the echo command and direct the output to a pipe
p1 = subprocess.Popen(['ping', '-c 2', host], stdout=subprocess.PIPE)

# Run the command
output = p1.communicate()[0]

print output

来源:https://www.cnblogs.com/taosiyu/p/12012612.html

标签:Python,Subprocess,函数
0
投稿

猜你喜欢

  • Python实现的各种常见分布算法示例

    2021-12-06 18:26:15
  • Python进度条的制作代码实例

    2022-01-01 23:17:34
  • Python利用FlashText算法实现替换字符串

    2023-05-17 06:18:11
  • 使用Python制作一个数据预处理小工具(多种操作一键完成)

    2023-07-06 20:50:21
  • 已安装tensorflow-gpu,但keras无法使用GPU加速的解决

    2021-08-15 12:17:42
  • 不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题

    2023-09-11 00:33:45
  • python如何删除字符串最后一个字符

    2022-06-07 14:14:04
  • python中日期和时间格式化输出的方法小结

    2023-07-01 11:39:31
  • ASP和Javascript中取整函数的应用

    2009-06-07 18:38:00
  • c++生成dll使用python调用dll的方法

    2023-02-16 11:40:05
  • python实现截取屏幕保存文件,删除N天前截图的例子

    2021-09-19 18:13:49
  • 利用python+ffmpeg合并B站视频及格式转换的实例代码

    2021-06-09 21:14:00
  • asp如何显示自定义随机信息?

    2010-06-08 09:39:00
  • python numpy元素的区间查找方法

    2021-12-22 17:10:31
  • 详解python分布式进程

    2023-07-01 16:25:16
  • 使用Alt提升可访问性

    2009-04-04 19:22:00
  • Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法

    2023-02-01 07:31:31
  • ACCESS模糊查询出现"内存溢出"

    2009-08-13 14:25:00
  • python库JsonSchema验证JSON数据结构使用详解

    2023-02-14 16:24:27
  • Python的包管理器pip更换软件源的方法详解

    2023-02-03 05:25:22
  • asp之家 网络编程 m.aspxhome.com