诚意
诚意如你,当一诚的态度对待

导航

 

 

【模块subprocess

https://segmentfault.com/a/1190000009176351

 

以前我一直用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如果组合使用shell = True调用系统shell可能会造成安全隐患不受信任的输入

 

 

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",但并不推荐这样的方式.

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

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

 

 

 

subprocess模块中的常用函数

函数

描述

subprocess.run()

Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。

subprocess.call()

执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)。

subprocess.check_call()

Python 2.5中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(..., check=True)。

subprocess.check_output()

Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。

subprocess.getoutput(cmd)

接收字符串格式的命令,执行命令并返回执行结果,其功能类似于os.popen(cmd).read()和commands.getoutput(cmd)。

subprocess.getstatusoutput(cmd)

执行cmd命令,返回一个元组(命令执行状态, 命令执行结果输出),其功能类似于commands.getstatusoutput()。

说明:

  1. Python 3.5之后的版本中,官方文档中提倡通过subprocess.run()函数替代其他函数来使用subproccess模块的功能;
  2. Python 3.5之前的版本中,我们可以通过subprocess.call()subprocess.getoutput()等上面列出的其他函数来使用subprocess模块的功能;
  3. subprocess.run()subprocess.call()subprocess.check_call()subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成。
  4. subprocess.getoutput()subprocess.getstatusoutput()函数是来自Python 2.xcommands模块的两个遗留函数。它们隐式的调用系统shell,并且不保证其他函数所具有的安全性和异常处理的一致性。另外,它们从Python 3.3.4开始才支持Windows平台。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

[struck模块]

案例:

import  struct

res = struct.pack('i',1111111111) #pack是压缩,i模式是int

print(res)      #b'\xc75:B'     #返回的是字节型的,

print(len(res)) #4      #且无论数字是多少(范围之内)为4个字节

 

obj = struct.unpack('i',res)        #unpack 是解压, i模式解压的是int, 返回的是元组

print(obj)      #(1111111111,)

print(obj[0])   #1111111111

 

 

 

posted on 2018-09-04 22:09  诚意  阅读(152)  评论(0)    收藏  举报